我对创建成员线程以在类实例的成员函数上运行的各种方法以及它们之间的区别感到困惑:-第一种方法-使用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是std::thread m_thread
给出的ClassMyType的成员变量,其中this
是其实例,run是同一类的成员函数。所有这些都会得到相同的结果吗?它们是等效的吗?另外,在最后两种情况下,如何使线程开始执行。
std::bind
期望第一个参数为可调用参数(但不拒绝无效参数(。
因此,第三种和第四种方法会创建不可用的对象。
要创建std::thread
,您确实有几个可用的变体:
std::thread(&MyType::run, this);
std::thread(std::bind(&MyType::run, this));
没有上述优势std::thread([this](){ return this->run(); );
允许处理run
过载,默认参数