繁体   English   中英

C ++ 11:linux上的std :: thread取决于pthread库吗?

[英]C++11: Is std::thread on linux depending on pthread library?

我读到pthread是C库并且与C ++对象模型不兼容,尤其是在讨论异常处理时。

所以我想知道在linux系统上,gcc / clang如何实现std::thread ,它是调用一些linux本机函数/内核apis还是什么?

另外,如何实现std::thread_local ,与__thread相关?

我读到pthread是C库并且与C ++对象模型不兼容,尤其是在讨论异常处理时。

此信息不准确。

gcc / clang如何实现std::thread

他们调用特定于平台的线程创建函数。 在Linux上它是pthread_create 您可以直接调用此函数。

当一个线程抛出异常并且没有被捕获时,调用std::terminate

请注意,您的应用程序必须使用-pthread标志进行编译和链接(使用-lpthread是不必要的,并且C和C ++都不够)。

我读到pthread是C库并且与C ++对象模型不兼容,尤其是在讨论异常处理时。

在这附近有一个声明是正确的,但这样的陈述是不正确的。

这里有两个事实。

  1. 如果自己调用pthreads函数,它确实只是一个C库,您最好确保在异常安全方面正确地执行所有操作。 如果将函数指针传递给pthread_create_...并且这些函数将抛出异常...您的程序可能会遇到大问题。 这应该是显而易见的,每当你从C ++与C库交谈时都会如此。

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

  2. pthread实际上并不需要知道您的任何对象,或任何ctors或dtors,或任何其他,以使您的程序多线程。 所有它需要产生一个线程,是一个函数指针,该函数指针将具有完全C兼容的签名。

    C ++编译器调用pthreads函数以实现std::thread ,编译器将发出与pthread正确对话的代码。 如果它以非法方式使用pthread来实现您的C ++程序,那么它就是编译器或标准库中的一个错误。

在编译器输出上使用ldd myExecutable来查找。

libstdc ++和libc ++显然都使用pthread,但它们并不是必需的。 它的证据可以在函数native_handle方法的文档中找到这里这里 文件说:

访问* this的原生句柄。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM