C++11:Linux 上的 std::thread 是否依赖于 pthread 库?

问题描述 投票:0回答:4

我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。

所以我想知道在linux系统上,gcc/clang是如何实现的

std::thread
,是不是调用了一些linux原生函数/内核api之类的?

另外,

std::thread_local
是如何实现的,与
__thread
相关?

linux multithreading c++11 pthreads
4个回答
4
投票

我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。

此信息不准确。

gcc/clang 如何实现

std::thread

它们调用特定于平台的线程创建函数。在 Linux 上是

pthread_create
。您可以直接调用此函数。

当线程抛出异常并且未被捕获时

std::terminate
被调用。

请注意,您的应用程序必须使用

-pthread
标志进行编译和链接(使用
-lpthread
是不必要的,对于 C 和 C++ 来说也是不够的)。


4
投票

我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。

附近有一个说法是正确的,但所写的这个说法是不正确的。

这里有两个事实。

  1. 如果自己调用pthreads函数,它确实只是一个C库,你最好确保在异常安全方面你所做的一切都是正确的。如果您将函数指针传递给

    pthread_create_...
    并且这些函数将抛出异常...您的程序可能会出现大问题。这应该是显而易见的,每当您从 C++ 与 C 库交谈时,这都是真的。

    这并不意味着不可能在 C++ 程序中使用这样的库!

  2. pthread 实际上不需要了解您的任何对象,或者它们的任何 ctor 或 dtor,或者其中的任何一个,以使您的程序成为多线程。生成线程所需的只是一个函数指针,并且该函数指针将具有完全 C 兼容的签名。

    C++编译器调用pthreads函数以实现

    std::thread
    时,编译器将发出与pthread正确对话的代码。如果它以非法方式使用 pthread 来实现您的 C++ 程序,则这是编译器或标准库中的错误。


1
投票

在编译器输出上使用

ldd myExecutable
来找出答案。

libstdc++ 和 libc++ 显然都使用 pthreads,但它们不需要这样做。可以在native_handle方法文档herehere中找到相关证据。文件说:

访问 *this 的本机句柄。

该函数结果的含义和类型是实现定义的。在 POSIX 系统上,这可能是 pthread_cond_t* 类型的值。在 Windows 系统上,这可能是 PCONDITION_VARIABLE。

返回定义底层线程句柄的实现。


0
投票

C++ 线程始终是底层库的包装器。 所以如果 您在 Linux 上使用 C++,C++ 线程/是/ pthreads。 参考

他们之间的差异 https://iq.opengenus.org/std-thread-vs-pthread/

© www.soinside.com 2019 - 2024. All rights reserved.