我有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);
答案 0 :(得分:1)
我不确定这是你的问题,但我认为它至少是一个贡献者很有可能:Windows锁定现在还不公平。有关详细信息,请参阅Joe Duffy的文章Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista。
特别是对于互斥体,Duffy说了以下内容(突出显示了我):
当然,Windows锁仍然是一个很小的公平。互斥锁的等待列表按FIFO顺序保存,OS始终唤醒此类等待队列前面的线程。 ...现在当一个锁变为无主时,仍然使用FIFO唤醒算法,但锁立即被标记为不可用。 另一个线程可以潜入并在唤醒线程被安排之前锁定
其他线程可以是刚刚释放锁的线程。在你的代码中,释放互斥锁的线程接下来要重新获取互斥锁,这是一个很好的位置。