我正在 Delphi 2009 中编写一个服务器应用程序,它实现了多种类型的身份验证。每种身份验证方法都存储在单独的 dll 中。第一次使用身份验证方法时,会加载适当的 dll。该dll仅在应用程序关闭时释放。
在服务器线程(连接)之间没有任何形式的同步的情况下访问 dll 是否安全?
最佳答案
简短回答:
是的,通常可以从多个线程调用 DLL 函数,因为每个线程都有自己的堆栈,并且调用 DLL 函数或多或少与调用您自己代码的任何其他函数相同。
长答案:
是否实际上可能取决于DLL函数是否使用共享可变状态。
例如,如果您执行以下操作:
DLL_SetUser(UserName, Password)
if DLL_IsAuthenticated then
begin
...
end;
那么从不同线程使用它肯定是不安全的。在此示例中,您无法保证在 DLL_SetUser
和 DLL_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/