【发布时间】:2017-11-10 22:49:45
【问题描述】:
我有 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);
【问题讨论】:
-
不要在您尝试同步的代码中创建互斥锁。
-
您的互斥锁心智模型似乎存在严重错误。除了告诉您互斥锁并没有像您认为的那样做之外,这里实际上没有可以回答的问题。
-
互斥锁只是说一次只能容纳一个东西。它没有说明各种参与者获得它的顺序。你所描述的是一个完全有效的结果。您可能想要某种队列。
-
或者改用可等待事件。
A可以在发送数据时发出一个事件信号,B可以在接收之前等待该事件。然后A可以等待B在收到数据后发出另一个事件的信号,然后再发送新数据。 -
你在标题中有 C++,但你标记为 C。这是你想要的吗?
标签: c winapi concurrency mutex