2017-05-24 49 views
0

我一直在寻找一段时间,因为我无法找到正确的答案,所以我决定提问。互联网在interporcess同步中的用法

其实我有两个进程

流程1:

#include <windows.h> 
#include <stdio.h> 

// This process creates the mutex object. 

int main(void) 
{ 
    HANDLE hMutex; 

    hMutex = CreateMutex( 
     NULL,      // default security descriptor 
     TRUE,      // mutex owned 
     TEXT("AnotherMutex")); // object name 

    if (hMutex == NULL) 
     printf("CreateMutex error: %d\n", GetLastError()); 
    else 
     if (GetLastError() == ERROR_ALREADY_EXISTS) 
      printf("CreateMutex opened an existing mutex\n"); 
     else printf("CreateMutex created a new mutex.\n"); 

    if(WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED) 
     printf("Error while waiting for the mutex.\n"); 
    else 
     printf("Mutex openned by second process.\n"); 

    CloseHandle(hMutex); 

    return 0; 
} 

流程2:

#include <windows.h> 
#include <stdio.h> 

// This process opens a handle to a mutex created by another process. 

int main(void) 
{ 
    HANDLE hMutex; 

    hMutex = OpenMutex( 
     MUTEX_ALL_ACCESS,   // request full access 
     FALSE,      // handle not inheritable 
     TEXT("AnotherMutex")); // object name 

    if (hMutex == NULL) 
     printf("OpenMutex error: %d\n", GetLastError()); 
    else printf("OpenMutex successfully opened the mutex.\n"); 

    if(!ReleaseMutex(hMutex)){ 
     printf("Error while releasing the mutex.\n") 
    } 

    CloseHandle(hMutex); 

    return 0; 
} 

所以,当我运行的第一个进程,它只是不等待第二个过程释放互斥量,但;当互斥体被创建为拥有,非信号时,它不应该等到某个进程/线程释放它,然后打印该消息?

+0

在您等待你已经拥有一个互斥体的第一过程,所以等待将立即得到满足;在第二个过程中,您正在释放您*不拥有的互斥锁,这是非法的。我认为尤金是对的,你应该使用一个事件来代替。 –

回答

1

看起来你已经在两种类型的同步对象之间产生混淆:MutexesEvents

Mutexes通常用于保护对共享资源的访问。在关键部分的入口处应调用Mutex上的WaitForSingleObject。如果Mutex不是由另一个执行单元(线程或进程)获得的,则该执行单元获得它并继续运行,否则将被锁定,直到其他进程释放它为止。在关键部分末尾Mutex应该被释放。请参阅Using Mutexes。这就是为什么你的过程没有被暂停。

Events另一方面用于同步执行单元或通知某事。当创建一个事件时,它指定了它的信号状态。当调用WaitForSingleObject并且事件处于非信号状态时,执行单元将被暂停,直到事件发出信号为止。见Using Events

你的情况

底线,你应该使用Event