1

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

4

2 回答 2

1

旧版本的 MSVC 运行时有多线程和单线程两种变体。不同之处在于单线程变体不能防止潜在的竞争条件。因此,如果调用 MSVC 运行时的代码从多个线程执行此操作,则无法安全地使用单线程运行时。

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

MSVC 在许多版本之前就停止提供单独的单线程和多线程运行时。人们想知道它是否会对您的应用程序产生影响。您能否检测到两个运行时选项之间的任何性能差异。如果不是,那么使用多线程运行时对我来说是有意义的。当您在将来更改代码时忘记这一点并为您的 MSVC DLL 引入额外线程时,选择单线程运行时只会给调试带来麻烦。

于 2013-09-26T07:07:04.867 回答
0

如果您打算使用 MT,C++ DLL 应该是 MT。如果您打算只从应用程序的一个线程中使用它,那么您不必这样做。但是,一旦您对可能存在线程冲突(例如与 DLL 内部管理的数据结构)有丝毫怀疑,就应该清楚地记录这一点。或者无论如何都使用 MT,注意适当的锁定并忘记它。(我之前的 Delphi 声明仍然成立)。

于 2013-09-27T23:11:09.827 回答