我正在 Delphi 2009 中编写一个服务器应用程序,它实现了多种类型的身份验证。每种身份验证方法都存储在单独的 dll 中。第一次使用身份验证方法时,会加载适当的 dll。仅当应用程序关闭时,DLL 才会被释放。
在服务器线程(连接)之间没有任何形式的同步的情况下访问 dll 是否安全?
简短回答:
是的,通常可以从多个线程调用 DLL 函数,因为每个线程都有自己的堆栈,并且调用 DLL 函数或多或少与调用您自己代码的任何其他函数相同。
长答案:
如果是actually可能取决于使用的 DLL 函数共享可变状态 or not.
例如,如果您执行以下操作:
DLL_SetUser(UserName, Password)
if DLL_IsAuthenticated then
begin
...
end;
那么最肯定的是not可以安全地从不同线程使用。在此示例中,您不能保证DLL_SetUser
and DLL_IsAuthenticated
没有其他线程进行不同的调用DLL_SetUser
.
但是,如果 DLL 函数不依赖于某种预定义的状态,即所有必要的参数都立即可用,并且所有其他配置对于所有线程都相同,您可以假设它会工作。
if DLL_IsAuthenticated(UserName, Password) then
begin
...
end;
但要小心:DLL 函数可能看起来是原子的,但内部使用了某些东西,而事实并非如此。例如,如果 DLL 创建一个始终具有相同名称的临时文件,或者它访问的数据库一次只能处理一个请求,则它算作共享状态。 (抱歉,我想不出更好的例子)
Summary:
如果 DLL 供应商说他们的 DLL 是线程安全的,我会在多个线程中使用它们而无需锁定。如果他们不知道 - 或者即使供应商不知道 - 您应该谨慎行事并使用锁定。
至少在遇到性能问题之前是这样。在这种情况下,您可以尝试创建多个应用程序/进程来包装您的 DLL 调用并将它们用作代理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)