我的代码剪断在下面:
#include <iostream>
#include <thread>
class Me{
public:
bool isLearning;
void operator()(bool startLearning){
isLearning = startLearning;
}
};
int main(){
Me m;
std::thread t1(m(true));
t1.join();
std::cout << m.isLearning << std::endl;
}
在传递参数时,我无法使用可调用对象启动线程,是否有任何方法可以启动线程并在线程构造函数中使用参数传递可调用对象?
答案 0 :(得分:9)
问题#1
std::thread t1(m(true));
没有按照您的想法行事。
在这种情况下,您正在调用函数对象并将其结果(无效)传递给std::thread的构造函数。
<强>解决方案强>
尝试传递您的函数对象和参数,如下所示:
std::thread(m, true);
问题#2
std::thread
将获取您的函数对象的副本,因此它使用和修改的对象将与main
中声明的对象不同。
<强>解决方案强>
尝试使用m
传递对std::ref
的引用。
std::thread(std::ref(m), true);
答案 1 :(得分:0)
std::thread t1(m, true);
请记住,如果没有正确的同步,
isLearning = startLearning;
和
std::cout << m.isLearning << std::endl;
同时执行构成数据竞争和未定义的行为。
最后不要忘记t1.join()
。