Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Multithreading 使用3个条件变量同步3个线程 我在VTK/QT环境中用C++编写程序。然而,这个问题主要是一个方法/算法的问题_Multithreading_Algorithm_Synchronization_Mutex_Condition Variable - Fatal编程技术网

Multithreading 使用3个条件变量同步3个线程 我在VTK/QT环境中用C++编写程序。然而,这个问题主要是一个方法/算法的问题

Multithreading 使用3个条件变量同步3个线程 我在VTK/QT环境中用C++编写程序。然而,这个问题主要是一个方法/算法的问题,multithreading,algorithm,synchronization,mutex,condition-variable,Multithreading,Algorithm,Synchronization,Mutex,Condition Variable,我在尝试同步三个正在运行的线程时遇到了困难: 1.线程:一次传输一个样本,并将其添加到“输出”缓冲区 2.线程:一次接收一个样本,并将其添加到“输入”缓冲区 3.线程:从“输出”和“输入”缓冲区中提取数据,并将其广告到单独的绘图缓冲区,以进行渲染 我希望这些线程能够同步运行,并尝试了一种方法,在这种方法中,我为每个线程使用一个条件变量和一个boolian条件,其中一个线程按照上面列出的顺序向循环中的下一个和第四个线程发信号。然而,当我这样做时,我会出现死锁,程序停止。我非常感谢您在这里提供一些意

我在尝试同步三个正在运行的线程时遇到了困难: 1.线程:一次传输一个样本,并将其添加到“输出”缓冲区 2.线程:一次接收一个样本,并将其添加到“输入”缓冲区 3.线程:从“输出”和“输入”缓冲区中提取数据,并将其广告到单独的绘图缓冲区,以进行渲染

我希望这些线程能够同步运行,并尝试了一种方法,在这种方法中,我为每个线程使用一个条件变量和一个boolian条件,其中一个线程按照上面列出的顺序向循环中的下一个和第四个线程发信号。然而,当我这样做时,我会出现死锁,程序停止。我非常感谢您在这里提供一些意见:)

以下是我的代码处理方法:

//boolian变量的初始条件:

readyForTransmit=true;
readyForReceive=false;
readyForPlotting=false;
线程1-传输:

while(1){
mutex->Lock();
//waits for condition/signal to proceed
while(!readyForTransmit)
    transmitConditionVariable->wait(mutex);
readyForTransmit=false;
mutex->Unlock();

//Here I transmit my sample
transmit();

//Triggers next thread - reception
mutex->Lock();
readyForReceive=true;
receiveConditionVariable->broadcast(); //Have also tried signal();
mutex->Unlock();
}
线程2-接收:

while(1){
mutex->Lock();
//waits for condition/signal to proceed
while(!readyForReceive)
    receiveConditionVariable->wait(mutex);
readyForReceive=false;
mutex->Unlock();

//Here I receive my sample
receive();

//Triggers next thread - reception
mutex->Lock();
readyForPlotting=true;
plottingConditionVariable->broadcast(); //Have also tried signal();
mutex->Unlock();
}
线程3-添加到打印缓冲区:

while(1){
mutex->Lock();
//waits for condition/signal to proceed
while(!readyForPlotting)
    plottingConditionVariable->wait(mutex);
readyForPlotting=false;
mutex->Unlock();

//Here I adds samples to plotting buffer
updatePlottingBuffers();

//Triggers next thread - reception
mutex->Lock();
readyForTransmit=true;
transmitConditionVariable->broadcast(); //Have also tried signal();
mutex->Unlock();
}
除此之外,我还通过线程安全地将样本推拉至缓冲器。所以这不应该是个问题

希望收到您的来信!=)

  • 快速回答:当您已经拥有锁时,不要等待变量为真。如果ReadyFortTransmit在进入mutex->Lock()区域后不为true,则永远不会为true,因为其他线程都无法进入其mutex->Lock()区域进行设置

  • 您似乎要同步线程,以便始终只发送一个项目,然后只接收一个项目,然后打印它。这不是并行行为,您可以将它们放在一个线程中,这样会更容易、更高效

  • 我将假设这只是测试代码,您可能希望在不等待绘图线程的情况下将多个项目传输到缓冲区。在本例中,您的问题看起来与消费者-生产者问题非常相似,这是使用信号量进行同步的教科书示例。您可以在此Wikipedia页面上找到几种可能的解决方案: 或者你可以在谷歌上搜索消费者生产者,你会找到很多好的答案


  • 谢谢你,费伦斯奎尔!答:一,。条件变量Wait()函数的概念是,它在等待前一个线程触发的信号时解锁互斥锁(因此,将其作为输入)。2.我同意这个实现在当前状态下没有并行行为,但我会在线程自己发布后立即发布下一个线程来改变这一点。这样会更有效率。3.这与CP问题非常相似,只是它有一个额外的消费者。然而,据我所知,我的解决方案使用了相同的原则?对不起,没有实现条件变量,我已经很久没有积极使用java了。对于迟来的回答,我也很抱歉,但我只是得到了足够的声誉来添加评论。