【问题标题】:C++ Unix Multithreading what happens "under the hood"?C++ Unix 多线程“幕后”会发生什么?
【发布时间】:2012-05-10 10:50:28
【问题描述】:

我想知道关于 Unix(特别是 Linux)上的 C++ 多线程的“幕后”会发生什么——尤其是操作系统和信号量等的参与。

我已经执行了初始的谷歌搜索,但它没有抛出。

有人可以描述或指出一个可以提供帮助的好资源吗?

编辑:当我在 C++ 中创建线程时,操作系统会创建/存储哪些“对象”来管理该线程以及所涉及的任何相关开销?

已经意识到这更像是一个 Linux 问题而不是 C++ 问题。

【问题讨论】:

  • 了解 NPTL - en.wikipedia.org/wiki/Native_POSIX_Thread_Library。非 Linux 实现会与此不同。
  • Linux 使用clone() 系统调用来创建可调度的执行上下文。它们用于生成进程(通过fork())和线程(通过pthreads)。
  • 如果你问clone()系统调用是如何实现的,看here

标签: c++ linux multithreading unix c++11


【解决方案1】:

这取决于您使用的线程库。

在 C++11 中,当您使用 #include <thread> 时,您平台的标准 C++ 库可以选择使用特定于操作系统的功能。在 Linux 的情况下,这通常通过 pthread 访问,或者在其他情况下,使用适当的标志直接调用 clone(...),并通过各种 ioctlsfcntl 以及在某些架构上的原子和内存模型内在函数(围栏、障碍等)。

如果您在 C++03 模式下使用 Boost.Thread,那么您基本上是在后台使用 pthread。 POSIX 操作系统中 Boost.Thread 中的所有构造都依赖于 POSIX 线程原语。

【讨论】:

  • 嗨,Dean,我不确定我的问题是否正确,但我的 Q 可能更面向操作系统。我对如何在后台创建和管理线程“实体”感兴趣。当我创建一个线程时,还会创建和存储什么来监视线程?
  • 我很困惑。我以为你在问 C++ 中的线程如何使用操作系统级别的工具来实现多线程。
  • 我更感兴趣的是:“当我用 C++ 编写线程时,引擎盖下发生了什么?”我对操作系统创建/存储哪些实体、线程如何管理等感兴趣?什么是用来定义线程边界的?我认为它更面向操作系统......所以基本上如果有人问你当有人创建一个线程时会发生什么,你会知道“引擎盖下”发生了什么
  • 这正是我和其他人所指出的。需要看内核通过系统调用提供的clone()函数调用等相关控制函数。如果您愿意,您可以深入研究 Linux 内核代码,了解它如何创建内存结构以及如何调度这些内容的详细信息。否则,我认为答案足以解决您的问题。
【解决方案2】:

尝试在“strace”的帮助下运行您的程序。这将列出对操作系统进行的所有系统调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 2012-08-06
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多