【问题标题】:How do you use std::jthread::get_stop_token()?你如何使用 std::jthread::get_stop_token()?
【发布时间】:2021-04-22 08:05:53
【问题描述】:

我对 std::jthread::get_stop_token 的工作原理感到困惑,因为它似乎具有固有的竞争条件。

也就是说,执行线程不能简单地对自己调用std::jthread(如this example),因为它不能保证std::jthread 对象在它开始执行时实际上是构造好的。在我看来,一个线程要使用它自己的get_stop_token,它需要(至少)一个额外的事件(如std::latch)来同步它自己的构造。

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

那么get_stop_token应该如何使用呢?
有没有一个简单的例子来说明std::jthread::get_stop_token() 的正确预期用法?

【问题讨论】:

  • 在我看来,它用于在请求停止时知道线程外。例如在第三个线程中:)

标签: c++ synchronization c++20 cancellation stdthread


【解决方案1】:

here 的示例看来,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); 
}

【讨论】:

  • 是的,std::jthreads 构造函数似乎检测到该函数是否可以使用std::stop_token 调用:en.cppreference.com/w/cpp/thread/jthread/jthread
  • 啊!这就解释了,谢谢!我猜(正如上面有人建议的那样)他们可能会暴露它,以便外人也可以检查取消?
猜你喜欢
  • 2021-07-21
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多