如何在 class 成员上启动一个新的 jthread

How to start a new jthread on a class member

我觉得这个问题很明显。到目前为止我已经尝试过:

#include <thread>
#include <chrono>

using namespace std::literals::chrono_literals;

class test
{
public:
    void member(std::stop_token stoken)
    {
        std::this_thread::sleep_for(1s);
    }

    void run()
    {
        // None compiles correctly
        // std::jthread jt(&member);
        // std::jthread jt(&test::member, this);
    }
};

int main()
{
    test t;
    t.run();

    return 0;
}

新的 jthread 和使用 stop_token 是否可行? Ps.: 当然可以通过使成员函数静态化或删除 stop_token 来解决它。但我很好奇是否有真正干净的解决方案而不是额外的 N 行黑客攻击。

您可以使用std::bind_frontthis绑定到&test::member并传递给jthread:

#include <thread>
#include <chrono>
#include <functional>

using namespace std::literals::chrono_literals;
class test
{
public:
    void member(std::stop_token stoken)
    {
        std::this_thread::sleep_for(1s);
    }

    void run()
    {
        std::jthread jt(std::bind_front(&test::member, this));
    }
};

int main()
{
    test t;
    t.run();
}