2013-09-25 49 views
1

我从Delphi中的TThread派生了一个TMyThread对象,而在TMyThread.Execute中,它将调用由Visual C++编写的DLL。在这种情况下,该DLL是否也要与多线程库一起编译并支持多线程?当被Delphi对象调用时,一个DLL是否必须是多线程的?

+0

不是,如果你只打算在这一个线程上调用它。是的,如果你打算创建几个线程并同时调用它们的DLL。 –

+0

如果涉及COM,请不要忘记CoInitialize。 –

回答

1

较旧版本的MSVC运行时包含多线程和单线程变体。不同的是,单线程变体不能防止潜在的竞争条件。因此,如果调用MSVC运行时的代码是通过多个线程执行的,则单线程运行时无法安全使用。

您描述的场景只有一个线程在您的MSVC DLL中执行代码。在这种情况下,单线程MSVC运行时可以安全使用。主机可执行文件是多线程的并不重要。重要的是多线程是否调用连接到MSVC DLL的MSVC运行时。

MSVC在许多版本之前停止发布单独的单线程和多线程运行时。有人想知道它是否对你的应用产生影响。您能检测到两个运行时选项之间的任何性能差异吗?如果没有,那么使用多线程运行时对我来说是有意义的。选择单线程运行时只是在未来对代码进行更改时忘记了这一点,并将额外的线程引入到MSVC DLL中,从而存储潜在的调试头痛。

0

如果您打算使用MT,C++ DLL应该是MT。如果您打算仅从您的应用程序的单个线程使用它,那么您不必那样做。但是,只要有丝毫怀疑可能存在线程冲突的情况,您应该清楚地记录这一点。在DLL内部管理数据结构。或者使用MT,注意正确的锁定并忘记它。 (我以前的德尔福声明仍然是正确的)。

+0

我不知道这是如何回答问题。问题是关于MSVC DLL是否需要多线程感知。任何发布为答案的东西都应该回答这个问题。你发布的内容是一条评论,应该作为原始问题发布。 SO不是论坛或新闻组。 :-) –

+0

Ehm - 正确。我读/明显回答太快。肯,谢谢你的提示。 =>完成。 – JensG

相关问题