在std::thread (c++11)中使用的函数可以有[[noreturn]]吗?

Could the function used in std::thread (c++11) have [[noreturn]]?

本文关键字:函数 noreturn thread std c++11      更新时间:2023-10-16

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

线程不创建一个新进程,也不使用fork或exec,它创建一个最终肯定会返回的线程。如果你的线程函数永远不会返回,你会挂在std::thread::join

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

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

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

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

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

我希望它(std::thread construction)在我的系统上是某种fork + execute的变体,一旦成功,它就没有什么可返回的了。

std::thread创建一个单独的线程(在同一进程中)。Fork +执行多个进程的工作

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

仅当您传递给std::thread的函数不返回时(即,如果函数调用std::exit、std::terminate、抛出所有情况或开始无限循环,等等)