我有一个 Delphi DLL,我想将它加载到我的应用程序中的一个线程(准确地说是多个线程)中。 DLL 只是创建一个对象,然后使用它并销毁它。从这个角度来看,DLL 代码是线程安全的。
但是如果我在线程中加载该 DLL 会发生什么? DLL 仍然是线程安全的吗?关于加载 DLL 的线程,我应该了解哪些信息?我已经看到 VCL 有 IsMultThread 属性,该属性是在我们创建线程时设置的,但是 dll 会收到有关此情况的通知还是我应该手动执行此操作?
最佳答案
最常见的陷阱是使用全局变量。只要您不使用任何全局变量(或正确同步对您使用的变量的访问),您就离线程安全还有很长的路要走。
例如,内存管理器使用IsMultiThread
在单线程情况下进行优化。就我个人而言,我认为现在这不是一个值得的优化,因为几乎所有有用的代码都有一些描述的线程。我只需在 DLL 的开头将 IsMultiThread
设置为 True,例如在 DLL .dpr 文件的 begin
/end
block 中,或者在单元的初始化部分之一中,这相当于同一件事。
为了直接回答您的问题,除非您在该 DLL 中创建线程,否则 DLL 中的 IsMultiThread
实例不会设置为 true。由于您在 EXE 中创建线程,因此您需要自己在 DLL 中执行此操作。
更一般地说,如果不知道代码的线程安全性以及线程安全的实际含义,就不可能对代码的线程安全性进行太多讨论。后一点可能听起来很奇怪,但我指的是 Eric Lippert 著名的 What is this thing you call "thread safe"? 中讨论的问题。文章。
关于multithreading - Delphi DLL - 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5677239/