为什么boost::thread的析构函数分离可接合线程,而不是像标准建议的那样调用terminate()
Why is destructor of boost::thread detaching joinable thread instead of calling terminate() as standard suggests?
根据c++ 0x标准草案,此代码:
void simplethread()
{
boost::thread t(someLongRunningFunction);
// Commented out detach - terminate() expected.
// t.detach();
}
…应该导致terminate()调用,但在boost线程的当前(boost 1.46.1)实现中不会这样做,线程只是在析构函数中分离并继续运行。
我的问题是:为什么?
我认为boost::线程与标准草案一样内联。
这是设计上的原因吗?它会在boost::thread的未来版本中改变吗?
主要是历史原因。boost::thread
排在第一位。std::thread
的建议来源于boost::thread
,最初具有boost::thread
现在所具有的行为。
然而,在标准化过程中,相当多的人希望std::thread::~thread()
到join()
在析构函数中,如果还没有加入,而不是detach()
。双方都进行了辩论,并进行了投票。50/50。争论越来越多,投票也越来越多。有些人倒向了另一种立场。但仍然是一半一半。
有人(我不记得是谁)建议terminate()
。投票进行了,虽然不是一致赞成(我不能投票赞成),但它确实获得了足够的多数,可以称为共识。
我想boost::thread
从来没有改变过,因为它有一个固定的用户群,没有人想为这个用户群不必要地破坏代码。
啊,罗布给我们指出了这个重复问题的原始答案答案指向N2802,其中包括基本原理。
我还应该注意到,std::thread
的原始提议有线程取消,而~thread()将取消未连接的线程,然后分离它,这很有意义。此代码路径通常仅在父线程因异常而展开时才会被选择。
相关文章:
- 将手写循环转换为标准库调用
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 该标准是否说明了例外和不同调用约定的共存
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- C++ 线程时出错,标准::调用:
- 在使用标准向量函数时引发'std::bad_alloc'实例后调用的终止
- 在 MASM 中调用标准库函数
- 从 ASM 调用C++代码中标准库的链接
- 如何查看我从 c++ 标准库中调用了哪些函数?
- 包装标准::线程调用函数
- C 标准的哪一部分涵盖通过空指针调用方法
- C++17标准对在nullptr上调用delete有何规定
- 重定向标准输出时调用 dup2 失败
- 是否可以保证C++标准库容器调用可替换的新功能
- 修复此标准::异步调用
- 生成标准输出仅在 4098 字节输出后调用
- 通过引用查找调用范围的标准引用是什么
- 是否存在标准调用约定
- 通过对dll的标准调用操作字符串的问题
- c++-builder:转换为标准调用类型