a_g*_*irl 3 c++ multithreading c++20
我正在尝试做这样的事情
#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 主干上编译-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 类似的例子(这里):
//...
std::jthread t([&ready, &readyMutex, &readyCV] (std::stop_token st) {
    while (!stoken.stop_requested()) {
        //...
    }
});
您的实施几乎是正确的。对 invokable的约束是它接受 astd::stop_token作为第一个参数。所以切换声明中的顺序doWork就可以理顺了。
void doWork(std::stop_token st, char a) {
    while (!st.stop_requested()) {
        std::cout << a << '\n';
    }
}
令牌来自库实现,因此无论如何它的构造并不意味着让您担心。