在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?

Posted

技术标签:

【中文标题】在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?【英文标题】:In g++ is C++ 11 thread model using pthreads in the background? 【发布时间】:2012-08-02 19:07:15 【问题描述】:

我只是在尝试g++ 4.6C++11 功能。 每次我使用-std=c++0x 标志编译一个简单的线程代码时,它要么因分段错误而崩溃,要么只是抛出一些奇怪的异常。

我阅读了一些与C++11 线程相关的问题,我意识到,我还需要使用-pthread 标志来正确编译代码。使用-pthread 工作正常,我能够运行线程代码。

我的问题是,C++11 多线程模型是否在后台使用Pthreads? 还是从头开始写的?

我不知道是否有成员是gcc 的贡献者,但我只是好奇。

【问题讨论】:

@Kay 看起来问题是关于 g++ 4.6。 “一些奇怪的异常”可能是std::system_error,这是标准在无法创建线程时所要求的(例如,因为您没有使用-pthread 链接到libpthread.so)。我正在努力改进异常给出的信息,请参阅gcc.gnu.org/PR52681 @JonathanWakely....是的,这是我在我的 Linux 机器上处理的例外情况...使用 AMD Turion X2....虽然它在没有 -pthread 标志的情况下顺利进行我的室友英特尔机器... 【参考方案1】:

如果您运行g++ -v,它将为您提供有关其配置方式的大量信息。其中之一通常是一条看起来像

的线
Thread model: posix

这意味着它被配置为将 pthreads 用于其线程库(libstdc++ 中的 std::thread),这意味着您还需要使用系统上 pthreads 可能需要的任何标志(Linux 上的-pthread )。

这与标准无关,只是g++如何实现标准的细节

【讨论】:

注:其中一件事将总是是那条线,如果缺少线程支持,它将显示“线程模型:单” 请注意,GCC 报告的线程模型也反映在 GCC 的其他部分,如 libgcc 和编译器本身。许多事情可能建立在该线程实现之上,并非都同样明显。 GCC 在这方面相当“单一”……【参考方案2】:

C++ 没有指定线程是如何实现的。在实践中,C++ 线程通常被实现为对预先存在的系统线程库(如 pthread 或 windows 线程)的瘦包装。甚至可以使用 std::thread::native_handle() 访问底层线程对象。

【讨论】:

G++ 不是一个 unix 编译器,它也可以在 Windows 上运行,它可以配置为使用 pthread-win32 或本机 Windows 线程。到目前为止,还没有人为 GCC 完成使其 C++11 线程库与 Windows 线程一起工作的工作,我将一些想法发布到 gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html【参考方案3】:

它崩溃的原因是,如果你没有指定-pthreads-lpthreads,就会链接来自libc 的一些弱定义的pthreads stub 函数。这些存根函数足以让您的程序无错误地链接。但是,实际创建 pthread 需要完整的 libpthread.a 库,并且当动态链接器 (dl) 尝试解决这些缺失的函数时,您会遇到分段违规。

【讨论】:

以上是关于在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pthreads 时的后台线程(很好,优先级)

使用 g++ 在 AIX 上编译 pthread.h 的东西

如何通过Eclipse将'-pthread'选项添加到g ++?

使用 pthread 从终端写入和读取

在停止等待协议实现中使用 pthread 时的 SIGSEGV

应该如何在 pthread() 中使用 yield?