2012-06-28 226 views
3

我在执行以下操作:CreateMutex,OpenMutex和进程同步

进程A应该使用OpenMutex来查看进程B是否正在运行。

进程B应该使用CreateMutex让进程A知道它正在运行。其实 很简单...

会发生什么情况是这样的:

  1. 运行过程中A - >它看到进程B没有运行。到现在为止还挺好。
  2. 运行进程B - >它创建互斥锁。
  3. 再次运行进程A - >它看到进程B正在运行。还好。
  4. 我关闭进程B(它也应该关闭互斥锁)。
  5. 运行过程A - >它仍然看到过程B正在运行! (OpenMutex不会失败)。

我在这里做错了什么?

这里是我的代码部分:

// Start of process B 
HANDLE hMutex = ::CreateMutex(NULL, TRUE, MY_MUTEX_NAME); 
MessageBox(NULL, _T("PROCESS B !"), _T("TEST"), 0); 
CloseHandle(hMutex); 
// End of process B 


// Start of process A 
HANDLE hMutex = ::OpenMutex(SYNCHRONIZE, FALSE, MY_MUTEX_NAME); 
if(hMutex != NULL) 
{ 
    MessageBox(NULL, _T("PROCESS B is alive !"), _T("TEST"), 0); 
} 
CloseHandle(hMutex); 
// End of process A 

回答

4

您必须调用OpenMutex释放互斥体的引用计数后关闭过程中的一个互斥体,使系统可以将其删除。请参阅MSDN。 “互斥对象在其最后一个句柄关闭时被销毁。”

有一个工作示例here

+0

是,但如果它创建互斥体(B在我的例子)退出或被杀害的过程是不应该的互斥体被释放? – Shaish

+0

MSDN文档说:“使用CloseHandle函数关闭句柄,系统在进程终止时自动关闭句柄,当最后一个句柄关闭时,互斥对象被销毁。”所以,当进程终止时,句柄关闭,但不是对象......这仍然是... – PermanentGuest

+0

和进程B呢?你需要那里的亲密句柄(自然而然)......我写了关于A的原因,因为那是很容易错过的地方。 – PermanentGuest