加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:04:17 所属栏目:Java 来源:网络整理
导读:我在Delphi 2009中编写一个服务器应用程序,实现了几种类型的身份验证.每个身份验证方法都存储在单独的dll中.第一次使用验证方法,加载相应的dll.该DLL仅在应用程序关闭时才被释放. 在服务器线程(连接)之间没有任何形式的同步访问dll是否安全? 解决方法 简答
我在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调用并将其用作代理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读