std::bind 线程成员变量到 class 的实例
std::bind a thread memeber variable to an instance of a class
我对在 class 实例的成员函数上为 运行 创建成员线程的各种方式感到困惑,以及它们之间的区别是什么:-
第一种方法 - 使用 lambda 表达式
auto m_thread = std::thread([this]{run();});
第二种方法
auto m_thread = std::thread(std::bind(&MyType::run, this));
第三种方法
auto res = std::bind(&m_thread, std::bind(&MyType::run, this));
第四种方法 -
auto res = std::bind(&m_thread, &MyType::run, this);
在这里,
m_thread 是 Class MyType 的成员变量,由 std::thread m_thread
给出,其中 this
是一个实例, 运行是同一个class的成员函数。所有这些都会给出相同的结果吗?它们是否等效?还有,最后两种情况如何让线程开始执行。
std::bind
期望第一个参数是可调用的(但不拒绝无效参数)。
所以第 3 和第 4 种方法创建了不可用的对象。
要创建 std::thread
,您确实有几个可用的变体:
std::thread(&MyType::run, this);
std::thread(std::bind(&MyType::run, this));
上面没有优势。
std::thread([this](){ return this->run(); );
允许处理 run
重载,默认参数。
我对在 class 实例的成员函数上为 运行 创建成员线程的各种方式感到困惑,以及它们之间的区别是什么:- 第一种方法 - 使用 lambda 表达式
auto m_thread = std::thread([this]{run();});
第二种方法
auto m_thread = std::thread(std::bind(&MyType::run, this));
第三种方法
auto res = std::bind(&m_thread, std::bind(&MyType::run, this));
第四种方法 -
auto res = std::bind(&m_thread, &MyType::run, this);
在这里,
m_thread 是 Class MyType 的成员变量,由 std::thread m_thread
给出,其中 this
是一个实例, 运行是同一个class的成员函数。所有这些都会给出相同的结果吗?它们是否等效?还有,最后两种情况如何让线程开始执行。
std::bind
期望第一个参数是可调用的(但不拒绝无效参数)。
所以第 3 和第 4 种方法创建了不可用的对象。
要创建 std::thread
,您确实有几个可用的变体:
std::thread(&MyType::run, this);
std::thread(std::bind(&MyType::run, this));
上面没有优势。std::thread([this](){ return this->run(); );
允许处理run
重载,默认参数。