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 中使用互斥锁进行进程间同步(win32 或 C++)