繁体   English   中英

DLL线程安全

[英]DLL thread safety

我正在用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作为单线程运行,但是我搜索了Internet,但我认为这是不可能的。

我曾尝试在互联网上搜索此问题,并且提出了一些有关使该函数static建议,以使其线程安全。

我也读过C ++ 0x将以某种方式使该线程安全。 但是MS VC Express不支持它。

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

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

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

当然,我不相信您可以做自己想做的事:

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

您将必须使用C样式原始数组来执行此操作。

我认为Boost.Interprocess正是您所需要的。 它既可以解决同步问题,又可以解决Jim Brissom在评论中说的一个问题,您甚至还没有想到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM