【问题标题】:boost thread and process cleanup on windows在 Windows 上提升线程和进程清理
【发布时间】:2011-12-21 13:35:52
【问题描述】:

在我的程序中,我有一个创建 boost::thread 的静态对象。线程应该一直运行到程序终止,但它不应该以随机状态终止,所以我在这个静态对象的析构函数中实现了受控线程终止。问题是当 main() 终止时,我的线程在调用析构函数之前就终止了。

现在的问题是:是否可以防止线程被销毁?或者至少延迟它,以便在调用析构函数之后发生?

【问题讨论】:

  • 在进入main之前启动线程有点危险,你不能移动这个对象/改变你的设计吗?
  • 线程是在输入main之后创建的。静态对象不是全局的;它在类(单例)的静态 get() 方法中。

标签: c++ windows multithreading process boost-thread


【解决方案1】:

将终止从析构函数移动到一个函数,并在 main 结束之前简单地调用它。

【讨论】:

  • 我希望我的图书馆负责清理,而不是将责任转移给它的用户。这将为微妙的错误创造空间。
  • @Tomasz Grobelny:然后使用std::atexit
  • 依赖静态析构函数不是很好。如果您的库被实现为 dll 加载/卸载将调用静态对象构造函数/析构函数。让用户完全控制是最好的选择。 C++ 标准没有讨论静态对象析构函数以及它们在线程中的行为
  • 我可能是错的,但 IIRC 标准认为析构函数应该以与构造函数相反的顺序运行。当然,它没有具体说明线程会发生什么——这显然是一个实现细节,在 Windows/Unix 上的工作方式显然不同。所以问题是如何使代码在 Windows 上的行为与在 Unix 上的行为相同。即:在所有标准 C++ 代码(特别是析构函数)执行完毕之前,不要关心线程。
  • @K-ballo:不幸的是,atexit 没有按预期工作。似乎对此无能为力:blogs.msdn.com/b/oldnewthing/archive/2007/05/03/2383346.aspx
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2018-07-03
  • 1970-01-01
  • 2016-10-23
  • 2013-06-07
相关资源
最近更新 更多