【问题标题】:std::thread without exceptions?std::thread 没有例外?
【发布时间】:2012-12-19 04:41:12
【问题描述】:

我想知道是否有一种方法可以毫无例外地使用std::thread,如果没有,我可以使用哪些替代方法?

实际上我的目标是 windows 和 linux 桌面,但将来可能会扩展。

edit: 仅使用编译器选项来禁用异常不是可接受的解决方案。错误必须以一种或另一种方式处理。

问题是我的代码中使用的唯一异常是那些处理std::thread 错误的异常。我想摆脱那些拥有无异常代码的人

edit2:我找到了 tinythread++ 库,如果需要,它似乎很容易修改并且可以正常工作。

【问题讨论】:

  • 只要你在调试你的项目,你就可以使用这些异常。之后,您可以假设不会抛出任何异常,因为异常将表明意外的环境变化。
  • 真正的问题是你假设创建一个线程总是成功的。通常情况也是如此,但通常这是一个错误的假设。它可能异常失败。这就是为什么std::thread 必须 在其构造函数中有异常的原因,这是传达失败的唯一有效方式(detachjoin throwing,OTOH,是牛,这些应该assert,因为加入不可加入的线程不是“异常失败”,这是一个编程错误)。不过,正如 Luke B 建议的那样,如果您不喜欢异常,请关闭它们。
  • “仅仅使用编译器选项来禁用异常,不是一个可以接受的解决方案” 所以使用异常。您基本上要求禁用 C++ 语言的一部分,但仍使用 C++ 语言。

标签: c++ multithreading exception c++11


【解决方案1】:

您可以禁用 STL 的异常,但对于每个编译器来说都是不同的。当然,由于标准实际上是说必须抛出一些异常,所以每当你做一些会抛出异常的事情时,你都会得到未定义的行为。

在 gcc 中,您可以使用 -fno-exceptions 禁用异常

在 MSVC 中:Can I disable exceptions in STL?

【讨论】:

  • 未定义的行为是不可接受的,我需要以一种或另一种方式处理错误。
  • 比如检测一个线程创建失败,然后很好的清理并报告错误。
  • @Thelvyn 为什么不创建自己的线程类来封装 std::thread 并处理那里的所有可能异常而不是其余代码?
  • 这不是问题,这意味着使用异常。我不想避免传播异常,而是完全避免使用它们。我找到了 tinythread++ 库,如果需要,似乎很容易修改。
  • @Thelvyn:那你用 C++ 编程会很糟糕。例外是语言的一部分,习惯它吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多