Windows上的进程间同步

时间:2018-02-21 14:16:44

标签: c windows winapi synchronization interprocess

任何人都可以在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文件(进程)创建相同的命名互斥锁,然后锁定互斥锁并立即释放。关键代码部分在发布后执行。

1 个答案:

答案 0 :(得分:0)

  1. 启动程序进程为每个其他进程创建一个Windows事件对象,然后创建其他(子)进程,并为每个进程传递所有事件对象的句柄(例如,在命令行上)。 / LI>
  2. 每个子进程都会引发自己的事件。
  3. 每个进程等待(使用WaitForMultipleObject)所有要引发的事件。
  4. 启动程序代码如下所示:

    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!
      }
    }