【问题标题】:What is the mechanism used by std::thread to block and wait for the OS/hardware thread to finish?std::thread 使用什么机制来阻塞并等待操作系统/硬件线程完成?
【发布时间】:2020-04-04 17:38:59
【问题描述】:

我不是说调用join()。我对 join() 中发生的机制感兴趣。我假设必须有一个对操作系统的系统调用,在硬件线程完成之前不会返回。以及如何向操作系统例程发出特定线程已完成的信号。只是概念上的理解。

【问题讨论】:

标签: c++ multithreading thread-synchronization


【解决方案1】:

操作系统的任务调度程序为每个存在的线程维护一个状态。此状态指示线程是否正在运行、准备运行、等待某事等。每当 CPU 内核空闲时,调度程序就会查看其列表以查找下一个就绪线程。

当一个线程调用std::thread::join 时,它最终会向操作系统内核发送一个系统调用,上面写着“我正在线程 X 上等待”。当内核接收到该系统调用时,它将使线程进入等待状态并避免调度它运行,直到线程 X 终止。当线程 X 退出时,操作系统会将等待的线程标记为准备好运行,以便在下次 CPU 释放时考虑运行。

确切的机制取决于所讨论的操作系统,但几乎所有操作系统的概念都是相似的。例如,在 Linux 上,std::thread::join 最终会调用 pthread_join,这最终会执行 FUTEX_WAIT 系统调用以等待相关线程。在 Windows 上,它将调用 WaitForSingleObjectEx

【讨论】:

  • 谢谢!我现在很清楚。我猜类似的机制是在条件变量的背后。
  • 通常是的,任何需要线程等待的东西都会以类似的方式工作。条件变量、I/O等
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
相关资源
最近更新 更多