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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |