如何在jthread中传递带有参数和stop_condition的函数

How to pass a function with arguments and stop_condition in jthread?

本文关键字:stop 参数 condition 函数 jthread      更新时间:2023-10-16

我正试图做一些类似的事情

#include <iostream>
#include <thread>
#include <chrono>
void doWork(char a, std::stop_token st = {}) {
while (!st.stop_requested()) {
std::cout << a << 'n';
}
}
int main() {
std::jthread t1{doWork, 'A'}, // error
t2{doWork, 'B'}; // error
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}

但它不会在带有-std=c++2a:的gcc主干上编译

/opt/compiler-explorer/gcc-trunk-20200219/include/c++/10.0.1/thread:537:20: error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues
537 |      static_assert(is_invocable_v<decay_t<_Callable>,
|                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
538 |       decay_t<_Args>...>,
|       ~~~~~~~~~~~~~~~~~~

有可能做这样的事情吗?

我认为这应该是可能的,因为我在lambda(这里(中看到了一个类似的例子:

//...
std::jthread t([&ready, &readyMutex, &readyCV] (std::stop_token st) {
while (!stoken.stop_requested()) {
//...
}
});

您的实现几乎是正确的。可调用的约束是它接受std::stop_token作为第一个参数。因此,切换doWork声明中的顺序将对其进行排序。

void doWork(std::stop_token st, char a) {
while (!st.stop_requested()) {
std::cout << a << 'n';
}
}

令牌来自库实现,所以它的构造无论如何都不会让您担心。