-3

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

4

3 回答 3

5

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

于 2015-09-24T13:29:31.037 回答
3

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

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

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

请注意,如果您使用低级函数,例如pthread_create创建线程或其他在编译时定义不可用的函数,则noreturn属性不会对通过指针调用函数的代码产生任何影响。

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

于 2015-09-24T13:30:12.583 回答
2

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

std::thread 创建一个单独的线程(在同一进程中)。fork + execve 在多个进程上工作。

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

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

于 2015-09-24T13:35:50.510 回答