【问题标题】:C++11 Kill threads when main() returns?C++11 在 main() 返回时杀死线程?
【发布时间】:2014-07-04 10:55:34
【问题描述】:

我听说“现代操作系统会在关闭进程时清理进程创建的所有线程”,但是当我返回 main() 时,我收到以下错误:

1) 此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。

2) 在没有活动异常的情况下终止调用

我的实现看起来像这样(我现在正在写,例如对糟糕的实现感到抱歉):

void process(int id)
{
    while(true) { std::this_thread::sleep_for(std::chrono::milliseconds(1); } }
}

int main()
{
    std::thread thr1(process, 0);
    std::thread thr2(process, 1);
    //thr1.detach();
    //thr2.detach();
    return 0;
}

如果我取消注释detach();s,没有问题,但我的处理线程将是套接字读取器/写入器,它们将无限运行(直到 main 返回)。那么如何处理呢?怎么了?

编辑:也就是说,我不能一个接一个地分离()每个线程,因为它们不会被正常终止(直到结束)。哦,再一次,如果我从 DDOS 窗口的 X 按钮关闭我的程序,(我的简单解决方案在这种情况下不起作用)我的 detach();由于程序强制终止,函数被传递,这又是错误:)

【问题讨论】:

  • 你想要发生什么?你想退出程序还是让它永远运行?
  • @usr 我只想在main() 返回时正常终止(edit: terminate/detach)所有线程。
  • 再读一遍你听到的那句话,看看它是如何从main返回的。
  • 请不要将引用格式化为代码。在英语中,我们使用引号来区分引文。
  • @R.MartinhoFernandes 哦,没关系。我是新来的,对此感到抱歉:)

标签: c++ multithreading c++11


【解决方案1】:

应用程序中发生的事情与操作系统可能执行的操作无关。

如果 std::thread 被销毁,仍然有一个可连接的线程,应用程序会调用 std::terminate,这就是显示的内容:http://en.cppreference.com/w/cpp/thread/thread/~thread`

对于 c++11 线程,如果您不关心它们的完成时间,您可以分离,或者您关心并需要在线程对象被销毁之前加入。

【讨论】:

  • 也许是一个简单的解决方案示例? 编辑: 自己处理析构函数并杀死/终止线程进程,对吧?
  • 只需将所有工作线程存储在一个类中,join() 它们在析构函数中。哦,Boost.Asio 似乎是适合你的工具(因为你想做一个网络应用程序)。您可以轻松设置网络工作线程的线程池并优雅退出。
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2016-08-06
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多