4

我有三个线程要一直运行到无限循环。线程对具有状态的对象进行操作,每个线程根据对象的状态执行或休眠。我希望输入线程继续检查 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 使输入线程继续无限循环,即使有新对象创建并传递给输入/处理/输出。注意:在我的实现中,我使用动态内存数据结构来创建和传递基于实时数据的新对象。

我的问题:

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

1 回答 1

1

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

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

于 2013-10-03T20:19:09.327 回答