【问题标题】:How to pass a function with arguments and stop_condition in jthread?如何在 jthread 中传递带有参数和 stop_condition 的函数?
【发布时间】:2020-06-03 09:35:30
【问题描述】:

我正在尝试做这样的事情

#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 (here) 类似的示例:

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

【问题讨论】:

    标签: c++ multithreading c++20


    【解决方案1】:

    您的实施几乎是正确的。 constraint on the invokable 是它接受 std::stop_token 作为 first 参数。所以在doWork的声明中切换顺序就可以搞定了。

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

    令牌来自库实现,因此无论如何它的构造并不意味着您担心。

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2014-09-03
      • 2012-12-11
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2010-11-20
      相关资源
      最近更新 更多