我在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是线程安全的,我会使用它们从多个线程没有锁定.如果他们不是 – 或者即使供应商不知道 – 你应该安全地使用锁定.