gpt4 book ai didi

c++ - 如何在jthread中传递带有参数和stop_condition的函数?

转载 作者:行者123 更新时间:2023-12-02 03:42:12 24 4
gpt4 key购买 nike

我正在尝试做这样的事情

#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));
}

但它不会在 gcc trunk 上使用 -std=c++2a 进行编译:

/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 示例( here ):

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

最佳答案

您的实现几乎是正确的。 constraint on the invokable是它接受 std::stop_token 作为第一个参数。因此,切换 doWork 声明中的顺序即可解决问题。

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

token 来自库实现,因此它的构造并不意味着让您担心。

关于c++ - 如何在jthread中传递带有参数和stop_condition的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60296573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com