Multithreading 使用3个条件变量同步3个线程 我在VTK/QT环境中用C++编写程序。然而,这个问题主要是一个方法/算法的问题
我在尝试同步三个正在运行的线程时遇到了困难: 1.线程:一次传输一个样本,并将其添加到“输出”缓冲区 2.线程:一次接收一个样本,并将其添加到“输入”缓冲区 3.线程:从“输出”和“输入”缓冲区中提取数据,并将其广告到单独的绘图缓冲区,以进行渲染 我希望这些线程能够同步运行,并尝试了一种方法,在这种方法中,我为每个线程使用一个条件变量和一个boolian条件,其中一个线程按照上面列出的顺序向循环中的下一个和第四个线程发信号。然而,当我这样做时,我会出现死锁,程序停止。我非常感谢您在这里提供一些意见:) 以下是我的代码处理方法: //boolian变量的初始条件:Multithreading 使用3个条件变量同步3个线程 我在VTK/QT环境中用C++编写程序。然而,这个问题主要是一个方法/算法的问题,multithreading,algorithm,synchronization,mutex,condition-variable,Multithreading,Algorithm,Synchronization,Mutex,Condition Variable,我在尝试同步三个正在运行的线程时遇到了困难: 1.线程:一次传输一个样本,并将其添加到“输出”缓冲区 2.线程:一次接收一个样本,并将其添加到“输入”缓冲区 3.线程:从“输出”和“输入”缓冲区中提取数据,并将其广告到单独的绘图缓冲区,以进行渲染 我希望这些线程能够同步运行,并尝试了一种方法,在这种方法中,我为每个线程使用一个条件变量和一个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();
}
除此之外,我还通过线程安全地将样本推拉至缓冲器。所以这不应该是个问题
希望收到您的来信!=)
谢谢你,费伦斯奎尔!答:一,。条件变量Wait()函数的概念是,它在等待前一个线程触发的信号时解锁互斥锁(因此,将其作为输入)。2.我同意这个实现在当前状态下没有并行行为,但我会在线程自己发布后立即发布下一个线程来改变这一点。这样会更有效率。3.这与CP问题非常相似,只是它有一个额外的消费者。然而,据我所知,我的解决方案使用了相同的原则?对不起,没有实现条件变量,我已经很久没有积极使用java了。对于迟来的回答,我也很抱歉,但我只是得到了足够的声誉来添加评论。