【问题标题】:interprocess synchronization on windowswindows上的进程间同步
【发布时间】:2018-02-21 14:16:43
【问题描述】:

谁能分享一些关于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 文件(进程)创建同名互斥锁,然后锁定互斥锁并立即释放。关键代码部分在发布后执行。

【问题讨论】:

  • 命名信号量怎么样?
  • 这不是链接共享服务。您有具体的代码和相关问题吗?
  • @kenny 当然,但是如果我使用函数 WaitForSingleObject(),只要只有 1 个不同的进程到达同一行(其余进程不同步),该进程就会继续。而且我认为使用 WaitForMultipleObjects() 没有意义,因为我每个进程只有一个线程-
  • 你可以在共​​享内存中构建一些自定义的东西,祝你好运! stackoverflow.com/questions/7894224/…
  • @LarryTheBlackbird 'WaitForMultipleObjects()' 对我来说很有意义。所有进程至少有一个线程,所以等待 N 个单线程进程就是在等待 N 个线程。

标签: c windows winapi synchronization interprocess


【解决方案1】:
  1. 启动进程为其他每个进程创建一个 Windows 事件对象,然后创建其他(子)进程,将所有事件对象的句柄传递给每个进程(例如,在命令行上)。
  2. 每个子进程都会引发自己的事件。
  3. 每个进程(使用 WaitForMultipleObject)等待所有要引发的事件。

启动程序代码如下所示:

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 和一个 HANDLE 数组。

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

【讨论】:

  • 感谢重播。正如我几秒钟前回答的那样,没有启动程序。我多次从批处理文件中运行相同的代码(相同的 exe 文件)。第一个到达临界区的代码应该等待其余的进程。基本上他们应该互相等待,直到所有进程都到达代码中的同一行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2013-12-15
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多