我在Delphi中从TThread派生了一个TMyThread对象,在TMyThread.Execute中,它将调用由Visual C ++编写的DLL。在这种情况下,DLL是否也必须使用多线程库编译并支持多线程?
答案 0 :(得分:1)
旧版本的MSVC运行时有多线程和单线程两种变体。不同之处在于单线程变体不能防止潜在的竞争条件。因此,如果调用MSVC运行时的代码是从多个线程执行的,则无法安全地使用单线程运行时。
您描述的方案只有一个线程在MSVC DLL中执行代码。在这种情况下,单线程MSVC运行时可以安全使用。主机可执行文件是多线程的并不重要。所有重要的是多个线程是否调用连接到MSVC DLL的MSVC运行时。
MSVC在许多版本之前停止发布单独的单线程和多线程运行时。人们想知道它是否会对您的申请产生影响。您能否检测到两个运行时选项之间的任何性能差异。如果没有,那么使用多线程运行时对我来说是有意义的。选择单线程运行时只是存储潜在的调试问题,当您在将来更改代码时忘记这一点并为MSVC DLL引入额外的线程。
答案 1 :(得分:0)
如果您打算使用MT,C ++ DLL应该是MT。如果您打算只从应用程序的一个单独的线程中使用它,那么您不必这样做。但是,只要您对线程冲突有任何疑问,就应该清楚地记录下来,例如:在DLL内部管理数据结构。或者使用MT无论如何,请妥善锁定并忘记它。 (我以前的德尔福声明仍然适用)。