从单个应用程序中的多个线程调用dll函数是否安全?

nor*_*aul 11 delphi dll multithreading

我正在Delphi 2009中编写一个服务器应用程序,它实现了几种类型的身份验证.每种身份验证方法都存储在一个单独的dll中.第一次使用身份验证方法时,将加载相应的dll.只有在应用程序关闭时才会释放dll.

在服务器线程(连接)之间没有任何形式的同步的情况下访问dll是否安全?

Dan*_*ski 17

简短回答:

是的,通常可以从多个线程调用DLL函数,因为每个线程都有自己的堆栈,调用DLL函数或多或少与调用自己代码的任何其他函数相同.

答案很长:

如果它实际上可能取决于使用共享可变状态的DLL函数.

例如,如果您执行以下操作:

DLL_SetUser(UserName, Password)
if DLL_IsAuthenticated then
begin
...
end;
Run Code Online (Sandbox Code Playgroud)

然后,它肯定是不是安全,可以从不同的线程使用.在这个例子中,你不能保证之间DLL_SetUserDLL_IsAuthenticated没有其他的线程进行到不同的呼叫DLL_SetUser.

但是如果DLL函数不依赖于某种预定义状态,即所有必需参数都可以立即使用,并且所有其他配置对于所有线程都是相同的,那么您可以认为它可以正常工作.

if DLL_IsAuthenticated(UserName, Password) then
begin
...
end;
Run Code Online (Sandbox Code Playgroud)

但要小心:DLL函数看起来可能是原子的,但内部使用的东西可能不是.例如,如果DLL创建一个总是具有相同名称的临时文件,或者它访问一次只能处理一个请求的数据库,则它将被视为共享状态.(对不起,我想不出更好的例子)

摘要:

如果DLL供应商说,他们的DLL是线程安全的,我会在没有锁定的情况下从多个线程使用它们.如果他们不是 - 或者即使供应商不知道 - 你应该安全地使用锁定.

至少在遇到性能问题之前.在这种情况下,您可以尝试创建多个应用程序/进程来包装DLL调用并将它们用作代理.