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

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

概述我有三个线程,我想继续运行,直到无限循环.线程在具有状态的对象上 *** 作,并且每个线程基于对象的状态执行或休眠.我希望输入线程继续检查state = 1的任何新对象并继续处理它,否则等待它. class myclass{ int state; myclass(){ this->state = 0; } void setState(int x){ 我有三个线程,我想继续运行,直到无限循环.线程在具有状态的对象上 *** 作,并且每个线程基于对象的状态执行或休眠.我希望输入线程继续检查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).

总结

以上是内存溢出为你收集整理的c – boost :: thread应该在无限循环中运行并等待没有互斥锁的新输入全部内容,希望文章能够帮你解决c – boost :: thread应该在无限循环中运行并等待没有互斥锁的新输入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存