我从Delphi中的TThread派生了一个TMyThread对象,而在TMyThread.Execute中,它将调用由Visual C++编写的DLL。在这种情况下,该DLL是否也要与多线程库一起编译并支持多线程?当被Delphi对象调用时,一个DLL是否必须是多线程的?
回答
较旧版本的MSVC运行时包含多线程和单线程变体。不同的是,单线程变体不能防止潜在的竞争条件。因此,如果调用MSVC运行时的代码是通过多个线程执行的,则单线程运行时无法安全使用。
您描述的场景只有一个线程在您的MSVC DLL中执行代码。在这种情况下,单线程MSVC运行时可以安全使用。主机可执行文件是多线程的并不重要。重要的是多线程是否调用连接到MSVC DLL的MSVC运行时。
MSVC在许多版本之前停止发布单独的单线程和多线程运行时。有人想知道它是否对你的应用产生影响。您能检测到两个运行时选项之间的任何性能差异吗?如果没有,那么使用多线程运行时对我来说是有意义的。选择单线程运行时只是在未来对代码进行更改时忘记了这一点,并将额外的线程引入到MSVC DLL中,从而存储潜在的调试头痛。
如果您打算使用MT,C++ DLL应该是MT。如果您打算仅从您的应用程序的单个线程使用它,那么您不必那样做。但是,只要有丝毫怀疑可能存在线程冲突的情况,您应该清楚地记录这一点。在DLL内部管理数据结构。或者使用MT,注意正确的锁定并忘记它。 (我以前的德尔福声明仍然是正确的)。
我不知道这是如何回答问题。问题是关于MSVC DLL是否需要多线程感知。任何发布为答案的东西都应该回答这个问题。你发布的内容是一条评论,应该作为原始问题发布。 SO不是论坛或新闻组。 :-) –
Ehm - 正确。我读/明显回答太快。肯,谢谢你的提示。 =>完成。 – JensG
- 1. 当试图从另一个窗口访问一个对象时,“调用线程必须是STA”错误
- 2. 确定一个对象是否被多个线程访问?
- 3. ExcelDna:Async:调用线程必须是STA
- 4. 调用线程必须是STA
- 5. 调用线程必须是STA错误
- 6. RichTextBox - InvalidOperationException:调用线程必须是STA
- 7. 多个定时器WPF应用程序,调用线程必须是STA错误
- 8. “invocables”必须是一个对象
- 9. queryselector必须是一个对象mongodb
- 10. 多线程时,我是否必须锁定数据库连接?
- 11. 如何创建一个必须调用每次阻塞的DLL的多线程应用程序被称为
- 12. 是否必须在主线程上调用UIView的-drawRect?
- 13. 我是否必须配置SQLiteCommand对象?
- 14. OpenFileDialoug当前线程在OLE调用之前必须是STA
- 15. 当Z3_ast对象被删除时是否有可用的回调?
- 16. 对象只被多个线程读取,是否需要同步
- 17. 确定一个dll是否被应用程序中的多个线程调用 - 使用ThreadId?
- 18. 当我调用addEventListener时,是否必须设置removeEventListener?
- 19. 当子类化threading.Thread时,是否必须调用super.join()?
- 20. 对xmlhttprequest调用的响应是否必须是XML?
- 21. Delphi COM对象多线程
- 22. 添加活动时的对象键是否必须是唯一的?
- 23. 如何测试一个对象是否在Delphi中被释放
- 24. 创建矩形时,调用线程必须是STA
- 25. wpf线程,线程必须是STA
- 26. 当使用 - >和“必须是类类型”时,给出“必须是类指针类型”的对象使用
- 27. 是否可以确定一个对象是否被另一个对象引用?
- 28. FormsAuthenticationTicket.Name是否必须是唯一的?
- 29. 必须是一个或多个“getSupportActionBar()setDisplayOptions ......”
- 30. MetaSerialisable对象参数后,**必须是一个映射,不是Unicode
不是,如果你只打算在这一个线程上调用它。是的,如果你打算创建几个线程并同时调用它们的DLL。 –
如果涉及COM,请不要忘记CoInitialize。 –