linux - 简单的 POSIX 线程问题

标签 linux multithreading posix pthreads

我有这个 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/

相关文章:

posix - 在 SML 中捕获命令的标准输出

c - 在 *nix 系统上的 C 中,使用 $PATH 或 "which"找到二进制文件的绝对路径?

c - 为什么 clock_nanosleep 优于 nanosleep 以在 C 中创建 sleep 时间?

c++ - 比 xlib 更快

c# - 异步操作和 UI 更新

java - 同步多线程服务器

ios - 如何在 iOS 编程中保持方法执行的顺序?

linux - 在从 oracle 表假脱机期间压缩数据

c - 在非规范模式下使用终端 IO 确定按钮边界

c - 当 pthread_attr_t 不为 NULL 时?