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

标签 multithreading delphi dll

我正在 Delphi 2009 中编写一个服务器应用程序,它实现了多种类型的身份验证。每种身份验证方法都存储在单独的 dll 中。第一次使用身份验证方法时,会加载适当的 dll。该dll仅在应用程序关闭时释放。

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

最佳答案

简短回答:

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

长答案:

是否实际上可能取决于DLL函数是否使用共享可变状态

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

DLL_SetUser(UserName, Password)
if DLL_IsAuthenticated then
begin
...
end;

那么从不同线程使用它肯定是安全的。在此示例中,您无法保证在 DLL_SetUserDLL_IsAuthenticated 之间没有其他线程对 DLL_SetUser 进行不同的调用。

但是,如果 DLL 函数不依赖于某种预定义的状态,即所有必要的参数都立即可用,并且所有其他配置对于所有线程都相同,您可以假设它会工作。

if DLL_IsAuthenticated(UserName, Password) then
begin
...
end;

但要小心:DLL 函数可能看起来是原子的,但内部使用了某些东西,而事实并非如此。例如,如果 DLL 创建一个始终具有相同名称的临时文件,或者它访问的数据库一次只能处理一个请求,则它算作共享状态。 (抱歉,我想不出更好的例子)

摘要:

如果 DLL 供应商说他们的 DLL 是线程安全的,我会在多个线程中使用它们而无需锁定。如果他们不知道 - 或者即使供应商不知道 - 您应该谨慎行事并使用锁定。

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

关于multithreading - 从单个应用程序中的多个线程调用 dll 函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/739673/

相关文章:

c# - 在 foreach 循环中启动任务使用最后一项的值

c# - WinForms 如何强制执行线程亲和性?

java - ThreadLocal 的目的?

java - 如何在 C# .NET Core 6 中使用 Java .dll?

delphi - FASM - 将字符串传递给 Delphi DLL

c# - 遇到锁时如何停止线程?

json - Delphi 和网络服务

regex - Delphi VCL提供正则表达式库吗?

delphi - 如何将接口(interface)添加到尚未包含 TInterfacedObject 的类层次结构中?

c# - Unity - 如何使用 c++ dll?