DLL线程安全

时间:2011-01-02 15:58:31

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

我正在开发MS VC express c ++中的DLL,它将同时加载到多个客户端应用程序中,DLL具有使用data_seg(".SHARED_SPACE_NAME")创建的共享内存空间。在这个共享内存空间中,有一些可以修改的向量。 让我们假设我们在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不支持它。

我没有多线程经验,所以我希望你能提供帮助。提前谢谢。

3 个答案:

答案 0 :(得分:3)

看起来您需要一个系统范围的互斥来保护您的关键代码段(不能同时运行的代码)。使函数静态与它无关,因为它不会阻止不同的应用程序同时运行它。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

我认为Boost.Interprocess正是您所需要的。它将解决同步问题,以及Jim Brissom在评论中说你甚至还没有考虑过的问题。