Delphi DLL - 线程安全

Raf*_*cci 6 delphi dll multithreading

我有一个Delphi DLL,我想在我的应用程序内部加载一个线程(不止一个,确切地说).DLL只是创建一个对象,然后它使用它并销毁它.从这个角度来看,DLL代码是线程安全的.

但是如果我在一个线程中加载该DLL会发生什么?DLL仍然是线程安全的吗?关于加载DLL的线程,我应该知道什么?我已经看到VCL具有在创建线程时设置的IsMultThread属性,但是dll会得到关于此的通知,还是应该手动执行?

Dav*_*nan 12

最常见的陷阱是使用全局变量.只要您不使用任何全局变量(或正确地同步访问您使用的变量),您将对线程安全起到很大的作用.

IsMultiThread例如,内存管理器使用它来在单线程情况下进行优化.我个人认为这几天不值得优化,因为几乎所有有用的代码都有一些描述的线程.我只是IsMultiThread在DLL的开头设置为True,例如在DLL .dpr文件的begin/ end块中,或者在你单元的一个初始化部分中设置为相同的东西.

要直接回答您的问题,IsMultiThread除非您在该DLL中创建一个线程,否则DLL中的实例将不会设置为true.由于您在EXE中创建线程,因此需要在DLL中自己完成.

更一般地说,在不知道代码的线程安全性以及线程安全的实际意义的情况下,根本不可能对代码的线程安全性说太多.后一点可能听起来很奇怪,但我所指的是Eric Lippert所着名的问题,你称之为"线程安全"的东西是什么?文章.


Ond*_*lle 6

设置IsMultiThreadTrue库项目主块中的第一件事:

library MyLibrary;
begin
  IsMultiThread := True;
  ...
end.
Run Code Online (Sandbox Code Playgroud)

这将指示内存管理器使用线程安全的分配/取消分配例程。