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(true)循环中的所有3个函数中,并用ifs替换当前的电流(确保没有嵌套的whiles).
总结以上是内存溢出为你收集整理的c – boost :: thread应该在无限循环中运行并等待没有互斥锁的新输入全部内容,希望文章能够帮你解决c – boost :: thread应该在无限循环中运行并等待没有互斥锁的新输入所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)