gpt4 book ai didi

c++ - boost::thread 应该在无限循环中运行并等待没有互斥量的新输入

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:05 24 4
gpt4 key购买 nike

我有三个线程,我想一直运行到无限循环。线程对具有状态的对象进行操作,每个线程根据对象的状态执行或休眠。我希望输入线程继续检查 state = 1 的任何新对象并继续处理它,或者等待它。

class myclass{
int state;

myclass(){
this->state = 0;
}
void setState(int x){
// set this->state to x
}
int getState(){
// return this->state
}
// stuff
}

void foo1(myclass* ob){
// stuff
while(ob->getState() != 0 || ob->getState() != 1)
{
// sleep for 500 ms
}
ob->setState(1);
}

void foo2(myclass* ob){
// stuff
while(ob->getState() != 1)
{
// sleep for 500 ms
}
ob->setState(2);
}

void foo3(myclass* ob){
while(ob->getState() != 2)
{
// sleep for 500 ms
}
// stuff
ob->setState(1);
}

int main(){
myclass* ob = new myclass();
boost::thread input_thread(boost::bind(&foo1, ob));
boost::thread process_thread(boost::bind(&foo2, ob));
boost::thread output_thread(boost::bind(&foo3, ob));

// stuff
// join all three threads
}

foo2 和 foo3 中的 while 循环在输入和处理线程中工作得很好,但是 foo1 中的 while 使输入线程继续无限循环,即使创建了新对象并传递给输入/处理/输出也是如此。注意:在我的实现中,我使用动态内存数据结构来创建和传递基于实时数据的新对象。

我的问题:

  • 为什么会这样?
  • 除了让线程在无限循环中等待新对象并在它们到达时对其进行操作之外,还有什么更好的选择?我想知道任何不使用互斥锁来减少扩展系统开销的解决方法。

最佳答案

首先,您的 OR 条件将始终为真(实例化时为 0 而不是 0 或实例化时为 1)。所以你在 foo1() 中的 while 总是正确的。但其他时间不存在该问题。

在这种情况下使用互斥锁是最好的主意。如果您想不惜一切代价避免它,请将所有 3 个函数中的代码放在 while(true) 循环中,并将当前的 while 替换为 ifs(确保没有嵌套的 while)。

关于c++ - boost::thread 应该在无限循环中运行并等待没有互斥量的新输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19165207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com