锁定和同步使用互斥

问题描述:

我创建将在几个进程和线程数,所以我创建了一个函数来实现锁定和同步是锁定和同步使用互斥

HANDLE WaitOnMutex(char* mt) 
{ 
    HANDLE ghMutex=NULL; 
    DWORD lastError=-1; 
    do 
    { 
     ghMutex = CreateMutex(NULL,TRUE,mt); 
     lastError= GetLastError(); 
     if(lastError!=ERROR_SUCCESS) 
     { 
      CloseHandle(ghMutex); 
      Sleep(2000); 
     } 
    } 
    while(lastError!=ERROR_SUCCESS); 
    return ghMutex; 
} 

运行相同功能的程序,我使用它像以下

HANDLE mtx=WaitOnMutex("Global\\DBG_MY_APP"); 
    //Do the work that needs sync 
    CloseHandle(mtx) 

这是锁定此功能的正确方法吗?或者我需要使用不同的方法..

注:我使用“全球”,因为我的应用程序的某些部分是WINSERVICE,我需要会话隔离过程

的代码是工作在锁之间测试环境,但我不确定我是否以正确的方式进行

+0

您正在使用错误的方式。有关更多信息,请参阅此文档。 [互斥msdn](http://msdn.microsoft.com/en-us/library/windows/desktop/ms686927%28v=vs.85%29.aspx) – rbelli 2012-03-30 17:23:38

+0

@rbelli可以告诉我什么是我的方式错误? – CnativeFreak 2012-03-30 17:25:11

+1

如果我完全理解你在做什么,你只是创建或打开互斥锁。你没有得到互斥体。为此,正如我在示例中看到的,您需要调用WaitForSingleObjects函数进行检查并获取互斥锁,然后调用ReleaseMutex函数释放它。 – rbelli 2012-03-30 17:31:21

您编码的内容是繁忙的等待,在大多数情况下,这并不理想。不仅如此,而且你已经用重量级互斥创建并释放了调用。

要使用已命名的互斥锁进行跨进程同步,每个进程只应调用CreateMutex一次。然后保持互斥手柄周围,并使用WaitForSingleObject等待它,并ReleaseMutex释放锁。然后,您可以在下次需要访问受保护的资源时再次使用WaitForSingleObject将其锁定,等等。

当你的过程完成了“永久”互斥体(例如因为过程正在退出),那么你可以拨打CloseHandle

+0

不错,但首先我不认为它忙于等待“睡眠(2000)”; 但我想你是正确的重量级互斥创建。 现在我的问题是函数CreateMutex中断?如果是这样,那么我的所有工作是错误的,如果不是那么我的工作是坏的表现.. – CnativeFreak 2012-03-30 17:36:17

+1

不可否认,2秒的等待不是“忙”,但它仍然是一个轮询循环,这需要调度程序唤醒线程只是为了检查它是否可以获取互斥锁,然后再回到睡眠状态。 – 2012-03-31 07:47:22

+1

由于计划问题,'CreateMutex'不能“失败”,除非创建互斥体的其他线程/进程更改访问权限,以便您的线程/进程没有必要的权限。如果这没有发生,那么你的线程创建互斥锁,并且你得到锁(因为你指定了“初始所有者”标志为true),或者另一个线程创建了互斥锁,并且你得到了句柄和一个'ERROR_ALREADY_EXISTS'错误代码,但不是锁。 – 2012-03-31 07:52:52

我想这将是一种工作,为“工作”一个足够宽松的定义。这不是我如何做这项工作。

我想我会做的事情更是这样的:

某处一次性初始化代码:期间

WaitForSingleObject(mutex, INFINITE); 

// write to log 

ReleaseMutex(handle); 

然后:

HANDLE mutex = CreateMutex(name); // yes, there are more parameters here. 

然后写入日志一次性关机代码:

CloseHandle(mutex); 

如果你使用的是C++而不是C,你通常需要通过RAII来处理,所以你可以创建一个日志对象,它在ctor中调用CreateMutex,并调用CloseHandle。然后你会有一个写函数,它在ctor中执行WaitForSingleObject,在其日志中写入operator(),并在其dtor中执行ReleaseMutex。这使得大部分代码相对简单,并且只需很少的工作就可以保持异常安全。

+0

糟糕 - 看起来像安东尼打败了我。 – 2012-03-30 17:35:10

+0

我的新问题:函数CreateMutex中断?如果是这样,那么我所有的工作是错误的,如果不是那么我的工作是坏的表现.. – CnativeFreak 2012-03-30 17:40:18

+0

我想这取决于你的意思是可中断的一点点,但对你的代码它的行为像原子。 – 2012-03-30 17:42:13