【问题标题】:Thread - is it a static duration object?线程 - 它是静态持续时间对象吗?
【发布时间】:2016-12-30 21:28:03
【问题描述】:

正如标题所说:std::thread 是静态持续时间对象吗?或者即使我没有显式访问静态变量,它也会使用一些?

编辑:

n2440 说(放弃进程):

破坏静态持续时间对象的主要问题是在它们的析构函数执行后访问静态持续时间对象,从而导致未定义的行为。为防止此问题,N2382 并发动态初始化和销毁​​要求所有用户线程在销毁开始之前完成(通过调用退出或从 main 返回)。

即使线程没有显式访问任何标记为static 的变量,这也成立吗?

【问题讨论】:

  • 什么是“静态持续时间对象”?
  • 您的问题含糊不清,请编辑使其更明确。 “或者它使用了一些”?
  • 澄清并添加更多细节。我再清楚不过了

标签: c++ multithreading


【解决方案1】:

std::thread 是一个类,它没有任何存储时长。

std::thread 的对象(或实例)可以具有任何存储持续时间(静态(全局)、自动(在堆栈中)、动态(在堆中))。

n2440(放弃进程)关注在全局对象被销毁后访问它们。当main 返回但仍有额外的线程在运行并访问全局对象(例如std::cout)时可能会发生这种情况,这些对象现在正被主线程销毁。

【讨论】:

  • 所以如果我在main() 上创建一个std::thread 则它不适用,除了在无限循环中旋转之外什么都不做,因为它没有任何静态存储持续时间,对吧?跨度>
  • @Dean 这取决于您如何创建std::thread(堆栈或堆)以及它是否分离。见open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0206r0.html
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2012-11-17
  • 2021-08-20
  • 2015-01-24
  • 2015-04-28
相关资源
最近更新 更多