任何人都可以在Windows上的进程间同步上共享一些链接或自己的经验。我运行我的程序的更多实例(每个都有1个线程)并想要同步它们。我读了一堆与它相关的函数link,似乎没有一个关于进程间通信的例子(它们都讨论了线程同步)。所以我希望进程等到所有进程都到达代码中的同一行。
这是我到目前为止所拥有的:;
interprocess_mtx = CreateMutex(NULL, FALSE, TEXT("mtx_name"));
if (interprocess_mtx == NULL) {
return (int)GetLastError();
}
if (WaitForSingleObject(interprocess_mtx, 10000) == WAIT_OBJECT_0) {
// here comes the code that needs to be executed synchronously
ReleaseMutex(interprocess_mtx);
}
if (CloseHandle(interprocess_mtx) == 0){
return (int)GetLastError();
}
由于
//编辑 解: 我运行第一个.exe文件,等待一小段时间,然后运行其余的。第一个进程创建一个命名的互斥锁,锁定它,等待例如5秒后释放它。其余的exe文件(进程)创建相同的命名互斥锁,然后锁定互斥锁并立即释放。关键代码部分在发布后执行。
答案 0 :(得分:0)
启动程序代码如下所示:
HANDLE handles[child_count];
for (int i = 0; i < child_count; ++i) {
handles[i] = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
}
for (int i = 0; i < child_count ++i) {
LaunchChild(i, handles);
}
DWORD result = ::WaitForMultipleObjects(child_count, handles, /*all=*/TRUE, INFINITE);
if (WAIT_OBJECT_0 <= result && result < WAIT_OBJECT_0 + child_count) {
// All of the children have set their events!
}
LaunchChild启动子进程的位置,在命令行上传递子进程号以及所有事件的句柄。每个子节点将命令行信息解析为child_index和HANDLEs数组。
void SyncWithSiblings(int child_index, HANDLE *handles) {
// Raise my own event:
::SetEvent(handles[child_index]);
DWORD result = ::WaitForMultipleObjects(child_count, handles, /*all=*/TRUE, INFINITE);
if (WAIT_OBJECT_0 <= result && result < WAIT_OBJECT_0 + child_count) {
// All of the siblings have set their events!
}
}