Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制执行两个进程的顺序?_C++_Multithreading_Boost_Deadlock - Fatal编程技术网

C++ 如何强制执行两个进程的顺序?

C++ 如何强制执行两个进程的顺序?,c++,multithreading,boost,deadlock,C++,Multithreading,Boost,Deadlock,我有一个父进程,它产生一定数量的子进程。这些子进程执行一些工作,并通过进程间消息队列将结果发送给父进程。但是,我还希望子进程等待父进程向它们发送消息已被正确接收和处理的确认,并仅在从父进程接收到此类信号后终止 现在,代码大致如下所示: parent child spawn process wait for message do processing send message r

我有一个父进程,它产生一定数量的子进程。这些子进程执行一些工作,并通过进程间消息队列将结果发送给父进程。但是,我还希望子进程等待父进程向它们发送消息已被正确接收和处理的确认,并仅在从父进程接收到此类信号后终止

现在,代码大致如下所示:

parent                      child
spawn process
wait for message            do processing
                            send message
receive message             wait on condvar
save the message
notify the condvar          resume execution
wait for child termination  terminate
当然,如果父对象在子对象开始等待condvar之前对condvar执行
通知,则会导致死锁-如果发生这种情况,则父对象等待子对象退出,子对象等待条件变量上的信号

因此,我的问题是:如何确保孩子总是首先执行
wait
,也就是在父母执行
notify
之前?还是我把整个问题都搞错了


提前谢谢。

是的,您处理问题的方式不对。或者更确切地说,使用condvar的方式是它们不应该工作的。Condvar是一种通知另一个线程“某物”(条件)已更改的方法。正是这种情况允许线程终止

使用condvar需要三个元素:条件、互斥和condvar本身。通知线程将执行以下操作:

{
    unique_lock(mutex);
    condition = true;
    condvar.notify();
}
{
    unique_lock(mutex);
    while(!condition)
        condvar.wait(mutex);
}
等待线程将执行以下操作:

{
    unique_lock(mutex);
    condition = true;
    condvar.notify();
}
{
    unique_lock(mutex);
    while(!condition)
        condvar.wait(mutex);
}
(使用RAII锁定互斥锁,这样我就不会传播直接调用
.lock()
.unlock()
方法的想法)


请注意,
while
非常重要<代码>等待
可能会在未收到通知的情况下错误唤醒

使用一个名为信号量或事件的进程间对象-保存状态的对象,这样即使在子进程等待之前父进程发出信号,信号仍将被接收。

是否使用一些进程间对象来记住被发出的信号?你在用什么操作系统?Windows。不过,如果它提供了这样的设施,我宁愿使用Boost。那么,C++呢?可能值得为此和/或Boost添加一个标签。实际上,哪种语言并不重要(除了说用哪种语言编写代码样本来回答)。问题在于condvar是如何使用的,任何一种被称为“condvar”的语言都以同样的方式使用它。Boost似乎缺少一些基本的同步原语:(我最终使用了一个名为semaphore的进程间变量,因为我认为这在这种情况下更合适,一个保存状态的对象。谢谢!请不要提及事件。它们是Windows特定的条件变量的精简版本,在其他任何地方都不存在(另一方面,Windows难以实现完整的condvars)。另一方面,信号量无处不在,可用于“完成”很好。事件以一种或另一种形式存在于几个嵌入式多任务器上。TBH,我也不太使用它们,尽管它们偶尔有用,例如当线程需要临时暂停时。也许Windows难以实现condvars,因为它不想支持虚假唤醒?