我有三个线程要一直运行到无限循环。线程对具有状态的对象进行操作,每个线程根据对象的状态执行或休眠。我希望输入线程继续检查 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 使输入线程继续无限循环,即使有新对象创建并传递给输入/处理/输出。注意:在我的实现中,我使用动态内存数据结构来创建和传递基于实时数据的新对象。
我的问题:
- 为什么会这样?
- 什么是让线程在无限循环中等待新对象并在它们到达时对其进行操作的更好选择?我想知道任何不使用互斥锁来减少扩展系统开销的解决方法。