我正在开发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不支持它。
我没有多线程经验,所以我希望你能提供帮助。提前谢谢。
答案 0 :(得分:3)
看起来您需要一个系统范围的互斥来保护您的关键代码段(不能同时运行的代码)。使函数静态与它无关,因为它不会阻止不同的应用程序同时运行它。
答案 1 :(得分:3)
此处使用的Windows API为CreateMutex。创建一个命名的互斥对象。当您需要操作共享数据时,请使用互斥锁句柄调用WaitForSingleObject,完成后,请调用ReleaseMutex。每个调用WaitForSingleObject的线程都拥有互斥锁的所有权,而调用WaitForSingleObject的任何其他线程都会停止,直到拥有的线程调用ReleaseMutex。
当然,我不相信你可以做你想做的事情:
您将不得不使用C样式原始数组执行此操作。
答案 2 :(得分:1)
我认为Boost.Interprocess正是您所需要的。它将解决同步问题,以及Jim Brissom在评论中说你甚至还没有考虑过的问题。