在std::jthread中使用外部停止控制以避免重复

问题描述 投票:0回答:1

std::thread
不同,
jthread 
逻辑上拥有一个
std::stop_source
类型的内部私有成员,它维护共享的停止状态。 (cpp参考链接)

我想使用外部

std::stop_source
以协调的方式控制多个线程的停止行为。

示例:

void thread_function(std::stop_token stoken)
{
  while (!stoken.stop_requested())
  {
    // Do something
  }
}

int main()
{
  std::stop_source ssource;  // common stop source
  std::jthread t1(thread_function, ssource.get_token());
  std::jthread t2(thread_function, ssource.get_token());

  // ...

  ssource.request_stop();

  // ...
}

如果我向

std::stop_token
的构造函数提供
jthread
,这是否会阻止
jthread
创建自己的内部
std::stop_source
,因为外部
stop_source
已经存在?

c++ c++20 stdthread
1个回答
0
投票

jthread
构造函数仅将附加参数转发给要调用的函数。它不会对这些参数执行任何其他操作。在您的代码中有 3 个停止源,
t1
t2
的停止源只是不用于停止它们。

来自cppreference

新的执行线程开始执行:

std::invoke(decay-copy(std::forward<F>(f)), get_stop_token(),
            decay-copy(std::forward<Args>(args))...)  (until C++23)

std::invoke(auto(std::forward<F>(f)), get_stop_token(),
        auto(std::forward<Args>(args))...)    (since C++23)

如果上面的表达式格式正确,否则开始执行:

std::invoke(decay-copy(std::forward<F>(f)),
            decay-copy(std::forward<Args>(args))...).     (until C++23)

std::invoke(auto(std::forward<F>(f)),
           auto(std::forward<Args>(args))...).    (since C++23)

在您的示例中,第一个变体的格式不正确,因为您的函数确实采用单个

stop_token
,它包含在
Args...
中。不过,两个线程
t1
t2
仍然有
stop_source
,您可以通过
get_stop_source
获得(或通过
get_stop_token
获得它们的代币。

© www.soinside.com 2019 - 2024. All rights reserved.