加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – boost :: thread应该在无限循环中运行并等待没有互斥锁的新

发布时间:2020-12-16 07:06:03 所属栏目:百科 来源:网络整理
导读:我有三个线程,我想继续运行,直到无限循环.线程在具有状态的对象上操作,并且每个线程基于对象的状态执行或休眠.我希望输入线程继续检查state = 1的任何新对象并继续处理它,否则等待它. class myclass{ int state; myclass(){ this-state = 0; } void setState
我有三个线程,我想继续运行,直到无限循环.线程在具有状态的对象上操作,并且每个线程基于对象的状态执行或休眠.我希望输入线程继续检查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中,即使有新对象被创建并传递给输入/处理/输出,输入线程也会进行无限循环.注意:在我的实现中,我使用动态内存数据结构来创建和传递基于实时数据的新对象.

我的问题:

>为什么会发生这种情况?
>什么是使线程在无限循环中等待新对象并在它们到达时对它们进行操作的更好的替代方案?我想知道任何解决方法,而不使用互斥锁来减少扩展系统的开销.

解决方法

首先,您的OR条件将始终为true(实例化时为0,而当为0或实例化时为0).所以你在foo1()中的时间总是如此.但是这个问题并不存在于其他问题上.

使用互斥锁将是这种情况的最佳选择.如果你想不惜任何代价避免它,将代码放在while(true)循环中的所有3个函数中,并用ifs替换当前的电流(确保没有嵌套的whiles).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读