【发布时间】:2021-08-10 16:59:30
【问题描述】:
我有两个从主线程开始并行运行的线程。
任何一个线程都可能失败。如果这样做,我也想要求另一个线程取消。
在 C++ 20 中有 std::stop_token 和 std::stop_source。
我发现了几个例子,其中主线程要求所有线程取消(延迟取消)。
但是,我没有找到任何一个工作线程可以推迟取消所有其他工作线程的例子。
这是怎么做到的?
【问题讨论】:
标签: c++ multithreading c++20
我有两个从主线程开始并行运行的线程。
任何一个线程都可能失败。如果这样做,我也想要求另一个线程取消。
在 C++ 20 中有 std::stop_token 和 std::stop_source。
我发现了几个例子,其中主线程要求所有线程取消(延迟取消)。
但是,我没有找到任何一个工作线程可以推迟取消所有其他工作线程的例子。
这是怎么做到的?
【问题讨论】:
标签: c++ multithreading c++20
为了使代码位置能够请求停止,该位置必须具有std::stop_source。为了让代码的位置能够响应停止,它必须有一个来自特定stop_source 的std::stop_token。
因此,为了使代码位置能够请求和响应停止,它必须同时拥有stop_source 和stop_token。
现在,由于stop_sources 能够生成stop_tokens,所以没有理由不能只给线程函数一个stop_source 并让它从中提取一个令牌。当然,这将无法使用std::jthreads 便利的能力来检测第一个参数是stop_token 的线程函数并生成stop_source,但是您的停止需求的性质不会使无论如何都是可行的。
另外,请记住stop_source 是可复制的;这些副本都共享相同的内部停止状态(以及从它们创建的任何stop_tokens)。所以没有理由通过引用传递它们。
【讨论】: