multithreading - Delphi DLL - 线程安全

标签 multithreading delphi dll

我有一个 Delphi DLL,我想将它加载到我的应用程序中的一个线程(准确地说是多个线程)中。 DLL 只是创建一个对象,然后使用它并销毁它。从这个角度来看,DLL 代码是线程安全的。

但是如果我在线程中加载该 DLL 会发生什么? DLL 仍然是线程安全的吗?关于加载 DLL 的线程,我应该了解哪些信息?我已经看到 VCL 有 IsMultThread 属性,该属性是在我们创建线程时设置的,但是 dll 会收到有关此情况的通知还是我应该手动执行此操作?

最佳答案

最常见的陷阱是使用全局变量。只要您不使用任何全局变量(或正确同步对您使用的变量的访问),您就离线程安全还有很长的路要走。

例如,内存管理器使用

IsMultiThread 在单线程情况下进行优化。就我个人而言,我认为现在这不是一个值得的优化,因为几乎所有有用的代码都有一些描述的线程。我只需在 DLL 的开头将 IsMultiThread 设置为 True,例如在 DLL .dpr 文件的 begin/end block 中,或者在单元的初始化部分之一中,这相当于同一件事。

为了直接回答您的问题,除非您在该 DLL 中创建线程,否则 DLL 中的 IsMultiThread 实例不会设置为 true。由于您在 EXE 中创建线程,因此您需要自己在 DLL 中执行此操作。

更一般地说,如果不知道代码的线程安全性以及线程安全的实际含义,就不可能对代码的线程安全性进行太多讨论。后一点可能听起来很奇怪,但我指的是 Eric Lippert 著名的 What is this thing you call "thread safe"? 中讨论的问题。文章。

关于multithreading - Delphi DLL - 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5677239/

相关文章:

c++ - 将 __stdcall 与 C++ DLL 一起使用

c++ - 使用不同的 C++ 环境创建 DLL

c - 哪个 Unix 没有线程安全的 malloc?

delphi - TrayIcon右键单击事件

c# - 在 C# 中命名同步对象以用于争用分析

windows - Windows Socket #10060 错误(WSAETIMEDOUT - 尝试连接超时但未建立连接)是否完全是编程错误?

database - ClientDataSet 中的 "key violation"自动增量字段 [Delphi]

delphi - EnumResourceNames 返回 Windows 错误 998(对内存位置的访问无效)

c - 您如何分析多核处理器的所有内核?

java - 如何处理Android应用程序的更多用户(拥有自己的帐户)?多线程?