C++ 如何使用std::jthread::get_stop_token()?

C++ 如何使用std::jthread::get_stop_token()?,c++,synchronization,c++20,cancellation,stdthread,C++,Synchronization,C++20,Cancellation,Stdthread,我对std::jthread::get\u stop\u token的设计原理感到困惑,因为它似乎有一个固有的竞争条件 也就是说,执行线程不能简单地在自身上调用std::jthread(如中所示),因为它不能保证std::jthread对象在开始执行时已实际构造。在我看来,线程要使用自己的get\u stop\u token,它(至少)需要一个额外的事件(比如std::latch)来单独根据自己的构造进行同步 然而,我在网上没有看到任何关于这个问题的例子或提及,因此在我看来,这可能不是预期的用途

我对
std::jthread::get\u stop\u token
的设计原理感到困惑,因为它似乎有一个固有的竞争条件

也就是说,执行线程不能简单地在自身上调用
std::jthread
(如中所示),因为它不能保证
std::jthread
对象在开始执行时已实际构造。在我看来,线程要使用自己的
get\u stop\u token
,它(至少)需要一个额外的事件(比如
std::latch
)来单独根据自己的构造进行同步

然而,我在网上没有看到任何关于这个问题的例子或提及,因此在我看来,这可能不是预期的用途。它看起来确实相当笨重且容易出错,而且可能效率低下,因为它需要工作线程在继续之前阻塞主线程

那么
get\u stop\u token
应该如何使用呢?

是否有一个简单的示例说明了
std::jthread::get_stop_token()
的正确预期用法?

从示例中可以看出
get_stop_token
实际上并不打算由客户端代码使用。它由
std::jthread
在后台调用,并传递给
std::jthread
调用的函数。看来这是必须要做的

#include <thread>
#include <iostream>
 
void f(std::stop_token stop_token, int value)
{
    while (!stop_token.stop_requested()) {
    }
}
 
int main()
{
    std::jthread thread(f, 5); 
}
#包括
#包括
无效f(标准::停止令牌停止令牌,int值)
{
而(!stop_token.stop_requested()){
}
}
int main()
{
std::jthread线程(f,5);
}

是的,似乎
std::jthread
s构造函数检测函数是否可以使用
std::stop\u令牌调用:啊!这就解释了,谢谢!我猜(正如上面有人建议的)他们可能会公开它,以便外部人员也可以检查取消?在我看来,它用于在请求停止时知道线程外部。例如,在第三个线程中:)