Mutex不同步C ++

时间:2017-11-10 22:49:46

标签: c winapi concurrency mutex

我有2个进程。第一个将一些数据发送到另一个,同步每个移动。 它实际上发送数据如下:

 Process : A sends 1
 Process : B receives 1
 Process : A sends 2
 Process : B receives 2

问题在于,当我运行进程A时,它会从头开始发送所有数据,我看到类似的内容:

 Process : A sends 1
 Process : A sends 2
 Process : A sends 3
 Process : B receives 3

我做了如下:

  Process A
   HANDLE mutex;    
    mutex = CreateMutex(NULL, FALSE, TEXT("mutex1"));
    if (mutex == INVALID_HANDLE_VALUE) {
        _tprintf(TEXT("Create mutex error !.\n"), GetLastError());
        return 1;
    }
   for (int i = 0; i < sender_length;i++) {
       WaitForSingleObject(mutex,INFINITE);
       sendToB(data);
       ReleaseMutex(mutex);
       }

     CloseHandle(mutex);

B流程如下:

 Process B:

  HANDLE mutex;

    mutex = OpenMutex(SYNCHRONIZE, FALSE, TEXT("mutex1"));

    if (mutex == INVALID_HANDLE_VALUE) {
        _tprintf(TEXT("Mutex error ! \n"), GetLastError());
        return 1;
      }
     for (int i = 0; i < sender_length;i++) {
           WaitForSingleObject(mutex,INFINITE);
           receiveFromA(data);
           ReleaseMutex(mutex);
           }

         CloseHandle(mutex);

1 个答案:

答案 0 :(得分:1)

我不确定这是你的问题,但我认为它至少是一个贡献者很有可能:Windows锁定现在还不公平。有关详细信息,请参阅Joe Duffy的文章Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista

特别是对于互斥体,Duffy说了以下内容(突出显示了我):

  

当然,Windows锁仍然是一个很小的公平。互斥锁的等待列表按FIFO顺序保存,OS始终唤醒此类等待队列前面的线程。 ...现在当一个锁变为无主时,仍然使用FIFO唤醒算法,但锁立即被标记为不可用。 另一个线程可以潜入并在唤醒线程被安排之前锁定

其他线程可以是刚刚释放锁的线程。在你的代码中,释放互斥锁的线程接下来要重新获取互斥锁,这是一个很好的位置。