如何在 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_front
将this
绑定到&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();
}
我觉得这个问题很明显。到目前为止我已经尝试过:
#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_front
将this
绑定到&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();
}