我问的是C ++ 11标准中的<thread>
库。
假设您有以下功能:
void func1(int a, int b, ObjA c, ObjB d){
//blahblah implementation
}
int main(int argc, char* argv[]){
std::thread(func1, /*what do do here??*/);
}
如何将所有这些参数传递给线程?我尝试列出像:
这样的参数std::thread(func1, a,b,c,d);
但它抱怨说没有这样的构造函数。解决这个问题的一种方法是定义一个包装参数的结构,但还有另一种方法吗?
答案 0 :(得分:48)
你真的只是在std::thread(func1,a,b,c,d);
中传递它们,如果对象存在则应该编译它们,但是出于另一个原因它是错误的。由于没有创建对象,因此无法加入或分离线程,程序将无法正常工作。因为它是一个临时的,所以析构函数会被立即调用,因为线程没有被连接或分离,但是调用了std::terminate
。在温度被销毁之前,您可以std::join
或std::detach
,例如std::thread(func1,a,b,c,d).join();//or detach
。
这是应该怎么做的。
std::thread t(func1,a,b,c,d);
t.join();
如果你不知道加入和分离之间的区别,你也可以分离线程,读取线程。
答案 1 :(得分:0)
这个问题可以通过创建一个可以保存函数参数的类来解决。
创建一个该类的对象,并传入要传递的参数。
然后将此对象传递给线程。
函数也应相应修改。
答案 2 :(得分:-1)
如果您收到此消息,可能忘记将twilio conference
放在文件的开头。 OP的签名似乎应该有效。
答案 3 :(得分:-1)
有同样的问题。我正在传递自定义类的非常量引用,并且构造函数抱怨(一些元组模板错误)。用指针替换了引用,并且可以正常工作。
答案 4 :(得分:-2)
在 Mac 上我试过了,它有效:
#include <iostream>
#include <thread>
using namespace std;
string t1(int firstInput, int secondInput){
cout << firstInput << " ,";
cout << secondInput << " ,";
return "finish thread t1";
}
int main()
{
int userInput1;
int userInput2;
cout << "Set a number" << endl;
cin >> userInput1;
cout << "Set second number"<< endl;
cin >> userInput2;
thread ThreadT1(t1, userInput1, userInput2 );
ThreadT1.join();
}