我有这个 POSIX 线程:
void subthread(void)
{
while(!quit_thread) {
// do something
...
// don't waste cpu cycles
if(!quit_thread) usleep(500);
}
// free resources
...
// tell main thread we're done
quit_thread = FALSE;
}
现在我想从主线程终止 subthread() 。我尝试过以下方法:
quit_thread = TRUE;
// wait until subthread() has cleaned its resources
while(quit_thread);
但是这不起作用! while() 子句永远不会退出,尽管我的子线程在释放其资源后明确将 quit_thread 设置为 FALSE!
如果我像这样修改我的关闭代码:
quit_thread = TRUE;
// wait until subthread() has cleaned its resources
while(quit_thread) usleep(10);
然后一切正常!有人可以向我解释为什么第一个解决方案不起作用以及为什么带有 usleep(10) 的版本突然起作用吗?我知道这不是一个很好的解决方案。我可以为此使用信号量/信号,但我想了解一些有关多线程的知识,所以我想知道为什么我的第一个解决方案不起作用。
谢谢!
最佳答案
没有 memory fence ,不能保证在一个线程中写入的值会出现在另一个线程中。大多数 pthread 原语都会引入屏障,一些系统调用(例如 usleep
)也是如此。在读取和写入周围使用互斥体会引入屏障,并且更普遍地防止多字节值在部分写入状态下可见。
您还需要将要求线程停止执行和报告线程已停止的想法分开,并且似乎对两者使用相同的变量。
关于linux - 简单的 POSIX 线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2834608/