std :: thread(c ++ 11)中使用的函数是否有[[noreturn]]?

时间:2015-09-24 13:23:05

标签: c++ c++11 function-attributes

对于std::thread t(foo);,拥有foo [[noreturn]] () {...}是否有意义?对于前者对于一个分离的线程(在应用程序完成之前用作一种守护进程)?

3 个答案:

答案 0 :(得分:5)

线程不会创建一个新进程并且不使用fork或exec,它会创建一个绝对应该最终返回的线程。如果你的线程函数永远不会返回,你将挂在std::thread::join

答案 1 :(得分:3)

  

使用[[noreturn]]标记用于线程的函数对gcc / clang有什么好处吗?

线程函数通常会返回。所以不,它们不能标有[[noreturn]]

除非它们被编码为具有无限循环,否则永远阻塞,或者调用终止线程或进程的函数。在这种情况下,您可能希望将它们标记为noreturn

注意,如果你使用像pthread_create这样的低级函数来创建一个在编译时无法定义的线程或其他函数,noreturn属性对代码没有任何影响通过指针调用你的函数。

忽略分离线程的线程函数的返回值。

答案 2 :(得分:2)

  

我希望它(std :: thread构造)在我的系统上是某种fork + execve变体,一旦成功就没有任何东西可以返回。

std :: thread创建一个单独的线程(在同一个进程中)。 fork + execve可以处理多个进程。

  

使用[[noreturn]]标记用于线程的函数对gcc / clang有什么好处吗?

只有当你传递给std :: thread的函数没有返回时(也就是说,如果函数调用std :: exit,std :: terminate,在所有情况下抛出或启动无限循环,等等)。