DLL Mutex - 一个例子

时间:2011-01-02 17:50:52

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

  

可能重复:
  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,系统将崩溃。 如果已经调用了该函数,我将如何创建一个“停顿”其他调用的互斥锁? 请举个例子,因为我花了最后两个小时试图在互联网上找到一个像样的人;)

提前致谢。

3 个答案:

答案 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的返回值转换为指向此结构的指针。

当然,你不能在这个共享区域有指针,但你可以在进程之间交换索引信息(当然是指共享区域中的数组)。

即使是链接器共享部分也不能保证在所有进程中加载​​到同一地址。