c - Windows 上的进程间同步

标签 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. 启动进程为每个其他进程创建一个 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!
  }
}

关于c - Windows 上的进程间同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908127/

相关文章:

php - PHP 的 "Virtual Directory Support"是我认为的吗?

linux - 如何在 ubuntu bash 中访问 Windows 目录

c - PlaySound() 在 WM_DESTROY 和 DrawText 问题后继续播放我的 .wav

c - 跟踪 C 变量 doxygen

c++ - 如何使用 scanf 从用户输入中获取字符串 ( char * ),由双引号分隔并包含空格

R 中的 Windows/Cygwin 链接

c - WM_KEYDOWN到达,WM_CHAR被跳过

c++ - 在Windows环境下如何知道我的USB设备的驱动程序已加载?

c++ - 为函数强制一个新的地址空间(使静态变量成为非静态的)

c - 获取指向字符串常量的指针