可能重复:
DLL thread safety
您好
我在MS VS C ++ express中写入一个DLL文件,它同时加载到多个客户端应用程序中,它使用共享内存和加载的DLL的其他实例。让我们假设DLL看起来像这样:
#include stdafx.h
#pragma data_seg (".TEST")
//Shared variables
#pragma data_seg ()
#pragma comment(linker, "/section:.TEST,RWS")
_DLLAPI void __stdcall doCalc()
{
//Do critical stuff
}
如果同时从两个或多个客户端调用doCalc
,系统将崩溃。
如果已经调用了该函数,我将如何创建一个“停顿”其他调用的互斥锁?
请举个例子,因为我花了最后两个小时试图在互联网上找到一个像样的人;)
提前致谢。
答案 0 :(得分:4)
每个流程的代码:
// At the start of every process
HANDLE sharedMemoryMutex = CreateMutex(NULL, FALSE, "My shared memory mutex");
// When you want to access shared memory:
DWORD dwWaitResult = WaitForSingleObject(sharedMemoryMutex, INFINITE);
if (dwWaitResult == WAIT_OBJECT_0 || dwWaitResult == WAIT_ABANDONED)
{
if (dwWaitResult == WAIT_ABANDONED)
{
// Shared memory is maybe in inconsistent state because other program
// crashed while holding the mutex. Check the memory for consistency
...
}
// Access your shared memory
...
// After this line other processes can access shared memory
ReleaseMutex(sharedMemoryMutex);
}
答案 1 :(得分:0)
您可以从位于MSDN here的“使用互斥对象”示例开始。为了在进程之间共享互斥锁,您需要更改CreateMutex调用以获取名称。
答案 2 :(得分:0)
您可能应该使用共享文件映射对象来创建共享内存,而不是使用链接器将节标记为共享。管理它的一种相对简单的方法是将所有共享变量放入单个struct
中,然后将MapViewOfFile
的返回值转换为指向此结构的指针。
当然,你不能在这个共享区域有指针,但你可以在进程之间交换索引信息(当然是指共享区域中的数组)。
即使是链接器共享部分也不能保证在所有进程中加载到同一地址。