【问题标题】:Could the function used in std::thread (c++11) have [[noreturn]]?std::thread (c++11) 中使用的函数可以有 [[noreturn]] 吗?
【发布时间】:2015-09-24 13:23:05
【问题描述】:

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

【问题讨论】:

  • 线程和进程是两个不同的东西?而且你的问题太模糊了。
  • 你的期望是错误的,因此剩下的问题实际上是没有实际意义的。
  • @Misgevolution,是的,当然,没有执行...应该是克隆+什么?跳转到新函数并期望它不会返回?
  • @anderas,是的,你是对的,但你保护它的方式并没有真正的帮助,而且没有 Misgevolutions 的评论,我不明白。

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,我纠正了我的误解并重新表述了这个问题(我对可加入的线程不感兴趣)
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 即使分离它们还会返回吗?我不太清楚,他们应该返回什么?
  • @Guest86 确实如此。已分离线程的线程函数的返回值被忽略。
  • 这个答案不正确。 [[noreturn]] 是不返回的线程函数的有效属性,编译器可以使用它来优化std::thread 实现中发生的代码 线程被调度。这样做是一件很奇怪的事情,您可能会在应用程序关闭时遇到问题。
【解决方案3】:

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

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

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

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

【讨论】:

  • 我明白了,我的情况是一个线程在程序运行期间作为一个迷你“守护进程”运行,我必须澄清当主线程关闭时这种线程会发生什么(如果操作系统清理它)...... Thnaks!
猜你喜欢
  • 2017-02-20
  • 1970-01-01
  • 2018-03-21
  • 2019-04-16
  • 2015-07-09
  • 2021-09-21
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多