与
不同,std::thread
逻辑上拥有一个jthread
类型的内部私有成员,它维护共享的停止状态。 (cpp参考链接)std::stop_source
我想使用外部
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
已经存在?
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
获得它们的代币。