多线程线程切换问题

3

我有一个生产者和消费者线程,它们是从主线程创建的。它们运行得很好,除了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();

}

除了cout之外,一切都正常(包括显示x的showX)。有什么问题吗?

2个回答

1
你的线程在没有对其加锁的情况下共享对象。生产者在消费者开始访问该对象之前没有退出。 在 boost::thread consumer_thread(boost::bind(foo2, ob)) 之前使用 producer_thread.join() 可以解决这个问题,但这不是最好的解决方法。最好使用互斥锁。

1

除了之前的答案,您还可以使用状态变量或条件变量来确保当其他线程正在处理对象时,您的对象不会被写入/处理。换句话说,您可以有一个状态变量,每个函数都将其值更改为完成后的唯一数字,并且每个函数将在状态变量假定先前函数应将其设置为的值时开始操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接