代码之家  ›  专栏  ›  技术社区  ›  reg

互斥体不同步C++

  •  0
  • reg  · 技术社区  · 7 年前

    我有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 回复  |  直到 7 年前
        1
  •  1
  •   Michael Burr    7 年前

    我不确定这是否是你的问题,但我认为这至少是一个原因:Windows锁已经有一段时间不公平了。参见Joe Duffy的文章 Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista 了解一些详细信息。

    当然,Windows锁仍然有点公平。互斥锁的等待列表按FIFO顺序保存,操作系统总是在这样的等待队列前面唤醒线程。。。现在,当锁变为无主时,仍然使用FIFO唤醒算法,但锁立即被标记为不可用。 另一个线程甚至可以在调度唤醒的线程之前潜入并获取锁

    另一个线程可以是刚刚释放锁的线程。在您的代码中,释放互斥体的线程接下来要做的事情是attmept重新获取互斥体,这是一个很好的位置。