c++ - DLL线程安全

标签 c++ multithreading visual-c++ dll

我正在使用 MS VC express c++ 开发一个 DLL,它将同时加载到多个客户端应用程序中,该 DLL 具有使用 data_seg(".SHARED_SPACE_NAME") 创建的共享内存空间。在这个共享内存空间中有一些可以修改的 vector 。 假设我们在 DLL 主体中有一个名为 doCalc() 的函数:

_DLLAPI void __stdcall doCalc(int argument)  
{  
    //Add to vector  
    //Loop through vector  
    //Erase from vector  
    //etc.  
}

如果 doCalc 从两个或多个客户端应用程序同时调用,系统将崩溃。 我希望 doCalc 调用“排队等待”以等待上一个调用完成 - 就像它是一个单线程应用程序一样。 因此,如果客户端 1 调用,然后在客户端 2 调用之后立即调用,则客户端 1 应该完成该功能,然后客户端 2 应该运行该功能。

最好的解决方案是将 DLL 作为单线程运行,但我已经在互联网上搜索过,我认为这是不可能的。

我已经尝试在互联网上搜索这个问题,并且我想出了一些关于使函数 static 使其线程安全的方法。

我还读到 C++0x 会以某种方式使这个线程安全。但是它在 MS VC express 中不受支持。

我没有多线程方面的经验,希望对你有所帮助。提前致谢。

最佳答案

此处使用的 Windows API 为 CreateMutex .创建一个命名的互斥对象。当您需要操作共享数据时,使用互斥句柄调用 WaitForSingleObject,完成后调用 ReleaseMutex。每个调用 WaitForSingleObject 的线程都获得互斥量的所有权,并且任何其他调用 WaitForSingleObject 的线程都将停止,直到拥有线程调用 ReleaseMutex。

当然,我不相信你可以做你想做的事:

  1. Dll 可以映射到每个进程空间中的不同地址。如果是这样,所有指针都将不正确。
  2. C++ 不允许对分配进行细粒度控制,并且有许多隐式分配,尤其是在处理 STL 对象时。我不相信您可以获得 vector 以将所有相关数据存储在共享区域中。

您将不得不使用 C 风格的原始数组来执行此操作。

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

相关文章:

java - 将 GLSurfaceView 上下文传递给线程

c++ - Qt 抑制数据库错误

c++ - 如何在 GNU Autotools 项目中包含 Boost?

c++ - 树向量化 : gcc optimization flag

c++ - 重载运算符+

c++ - 用 fork() 模拟线程

c# - 带属性赋值的线程安全构造

c# - 如何使函数像 IsWordPronounceable(SomeWord :String): boolean;

c++ - 从 cpp 和 hh 文件制作库

c++ - c++ 标准关于在默认析构函数中丢失抛出说明符的内容