【问题标题】:Can I use std::stop_source to deferred cancel all worker threads from a worker thread?我可以使用 std::stop_source 从工作线程中延迟取消所有工作线程吗?
【发布时间】:2021-08-10 16:59:30
【问题描述】:

我有两个从主线程开始并行运行的线程。 任何一个线程都可能失败。如果这样做,我也想要求另一个线程取消。 在 C++ 20 中有 std::stop_tokenstd::stop_source。 我发现了几个例子,其中主线程要求所有线程取消(延迟取消)。 但是,我没有找到任何一个工作线程可以推迟取消所有其他工作线程的例子。 这是怎么做到的?

【问题讨论】:

    标签: c++ multithreading c++20


    【解决方案1】:

    为了使代码位置能够请求停止,该位置必须具有std::stop_source。为了让代码的位置能够响应停止,它必须有一个来自特定stop_sourcestd::stop_token

    因此,为了使代码位置能够请求和响应停止,它必须同时拥有stop_sourcestop_token

    现在,由于stop_sources 能够生成stop_tokens,所以没有理由不能只给线程函数一个stop_source 并让它从中提取一个令牌。当然,这将无法使用std::jthreads 便利的能力来检测第一个参数是stop_token 的线程函数并生成stop_source,但是您的停止需求的性质不会使无论如何都是可行的。

    另外,请记住stop_source可复制的;这些副本都共享相同的内部停止状态(以及从它们创建的任何stop_tokens)。所以没有理由通过引用传递它们。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多