我正在使用 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。
当然,我不相信你可以做你想做的事:
- Dll 可以映射到每个进程空间中的不同地址。如果是这样,所有指针都将不正确。
- C++ 不允许对分配进行细粒度控制,并且有许多隐式分配,尤其是在处理 STL 对象时。我不相信您可以获得 vector 以将所有相关数据存储在共享区域中。
您将不得不使用 C 风格的原始数组来执行此操作。
关于c++ - DLL线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4579168/