14

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

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

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

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

4

3 回答 3

23

如果你运行g++ -v它,它会给你一堆关于它是如何配置的信息。其中之一通常是一条看起来像的线

Thread model: posix

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

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

于 2012-08-02T19:15:08.053 回答
9

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

于 2012-08-02T19:16:02.417 回答
2

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

于 2014-09-12T23:05:42.530 回答