【发布时间】:2019-11-25 18:08:48
【问题描述】:
我不明白为什么当 std::thread 被破坏时,它必须处于 join() 或 detach() 状态。
Join 等待线程完成,而 detach 不会。 似乎有一些我不理解的中间状态。 因为我的理解是 join 和 detach 是互补的:如果我不调用 join() 而不是 detach() 是默认的。
这样说吧,假设您正在编写一个创建线程的程序,并且仅在该线程生命周期的后期才调用 join(),所以在调用 join 之前,线程基本上都在运行,就好像它是分离,不是吗?
逻辑上 detach() 应该是线程的默认行为,因为这是线程的定义,它们并行执行而与其他线程无关。
那么当线程对象被破坏时,为什么要调用 terminate() 呢?为什么标准不能简单地将线程视为分离?
我不理解在线程被破坏之前没有调用 join() 或 detached() 时终止程序的基本原理。这样做的目的是什么?
更新:
我最近遇到了这个。 Anthony Williams 在他的《Concurrency In Action》一书中指出,“C++17 的一个提议是关于一个与 std::thread 类似的 join_thread 类,除了它会像 scoped_thread 一样自动加入析构函数。这没有在委员会中达成共识,因此没有被标准接受(尽管它仍然在 C++20 中作为 std::jthread 的轨道)......”
【问题讨论】:
-
有一个关于这个的讨论,我将尝试找到链接,因为这种行为与
boost::thread的行为不同。最终,尽管他们决定调用std::terminate,如果它是joinable -
另见:When should I use
std::thread::detach?:在其他线程运行时让main线程退出存在问题。 -
自动加入析构函数只是交易的一部分。例如,如果您将一个线程移动到一个可连接线程,它也会终止。
标签: c++ multithreading