windows上的进程间同步

Posted

技术标签:

【中文标题】windows上的进程间同步【英文标题】:interprocess synchronization on windows 【发布时间】: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() 没有意义,因为我每个进程只有一个线程- 你可以在共​​享内存中构建一些自定义的东西,祝你好运! ***.com/questions/7894224/… @LarryTheBlackbird 'WaitForMultipleObjects()' 对我来说很有意义。所有进程至少有一个线程,所以等待 N 个单线程进程就是在等待 N 个线程。 【参考方案1】:
    启动进程为其他每个进程创建一个 Windows 事件对象,然后创建其他(子)进程,将所有事件对象的句柄传递给每个进程(例如,在命令行上)。 每个子进程都会引发自己的事件。 每个进程(使用 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 文件)。第一个到达临界区的代码应该等待其余的进程。基本上他们应该互相等待,直到所有进程都到达代码中的同一行

以上是关于windows上的进程间同步的主要内容,如果未能解决你的问题,请参考以下文章

Windows进程间共享内存通信实例

Windows 中的进程间同步屏障

Windows 进程间同步之类的事件?

在 windows 中使用互斥锁进行进程间同步(win32 或 C++)

Python time.perf_counter 进程间零时间同步;操作系统一致?

windows文件映射