多线程线程切换问题

Posted

技术标签:

【中文标题】多线程线程切换问题【英文标题】:multithreading thread switching issue 【发布时间】:2013-10-01 01:36:19 【问题描述】:

我有一个从 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。出了什么问题?

【问题讨论】:

【参考方案1】:

您的线程正在共享对象,实际上并没有对其进行任何锁定。在消费者开始访问对象之前生产者没有退出。 在 boost::thread consumer_thread(boost::bind(foo2, ob)) 之前使用 producer_thread.join() 应该可以解决这个问题,这不是最好的解决方法。使用互斥锁将是理想的选择。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于多线程线程切换问题的主要内容,如果未能解决你的问题,请参考以下文章

无解问题python为何多线程无法切换

多线程上下文切换

多线程上下文切换

多线程中的上下文切换

使用 vscode 调试多线程 C 程序时单步切换线程

python线程及多线程实例讲解