我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。
所以我想知道在linux系统上,gcc/clang是如何实现的
std::thread
,是不是调用了一些linux原生函数/内核api之类的?
另外,
std::thread_local
是如何实现的,与__thread
相关?
我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。
此信息不准确。
gcc/clang 如何实现
std::thread
它们调用特定于平台的线程创建函数。在 Linux 上是
pthread_create
。您可以直接调用此函数。
当线程抛出异常并且未被捕获时
std::terminate
被调用。
请注意,您的应用程序必须使用
-pthread
标志进行编译和链接(使用 -lpthread
是不必要的,对于 C 和 C++ 来说也是不够的)。
我读到 pthread 是 C 库,与 C++ 对象模型不兼容,特别是在谈论异常处理时。
附近有一个说法是正确的,但所写的这个说法是不正确的。
这里有两个事实。
如果你自己调用pthreads函数,它确实只是一个C库,你最好确保在异常安全方面你所做的一切都是正确的。如果您将函数指针传递给
pthread_create_...
并且这些函数将抛出异常...您的程序可能会出现大问题。这应该是显而易见的,每当您从 C++ 与 C 库交谈时,这都是真的。
这并不意味着不可能在 C++ 程序中使用这样的库!
pthread 实际上不需要了解您的任何对象,或者它们的任何 ctor 或 dtor,或者其中的任何一个,以使您的程序成为多线程。生成线程所需的只是一个函数指针,并且该函数指针将具有完全 C 兼容的签名。
当C++编译器调用pthreads函数以实现
std::thread
时,编译器将发出与pthread正确对话的代码。如果它以非法方式使用 pthread 来实现您的 C++ 程序,则这是编译器或标准库中的错误。
C++ 线程始终是底层库的包装器。 所以如果 您在 Linux 上使用 C++,C++ 线程/是/ pthreads。 参考