我有一个从main创建的生产者和消费者线程。它们执行得很好,除了cout语句
class myclass{
int x;
// stuff
}
void foo1(myclass* ob){
setX(ob->x);
// stuff
}
void foo2(myclass* ob){
cout << ob->x << endl; // ONLY THIS DOESN'T EXECUTE
ob->getX();
// stuff
}
int main(){
myclass* ob = new myclass();
boost::thread producer_thread(boost::bind(foo1, ob));
boost::thread consumer_thread(boost::bind(foo2, ob));
// stuff
producer_thread.join();
consumer_thread.join();
}
一切正常(包括显示x的showX,cout除外。出了什么问题?
答案 0 :(得分:1)
您的线程正在共享该对象而实际上没有任何锁定。生产者在消费者开始访问该对象之前没有退出。 在boost :: thread consumer_thread(boost :: bind(foo2,ob))之前使用producer_thread.join()应该解决这个问题,这不是最好的修复方法。使用互斥锁是理想的。
答案 1 :(得分:1)
添加到上一个答案,您还可以使用状态变量或条件变量来确保当某个其他线程正在处理它时,您的对象不会被线程写入/处理。换句话说,您可以在完成时将每个函数的值更改为唯一编号的状态变量,并且当状态变量假定前一个函数应该将其设置为的值时,每个函数将开始操作。