
[英]Is it safe to pass arguments by reference into a std::thread function?
[英]Pass multiple arguments into std::thread
我问的是 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);
但它抱怨没有这样的构造函数。 解决这个问题的一种方法是定义一个结构来打包参数,但还有另一种方法可以做到这一点吗?
您实际上只是将它们传递给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();
如果您不知道加入和分离之间的区别,您也可以分离线程,阅读线程。
有同样的问题。 我正在传递自定义类的非常量引用,并且构造函数抱怨(一些元组模板错误)。 用指针替换了引用并且它起作用了。
这个问题可以通过创建一个可以保存函数参数的类来解决。
创建一个此类的对象,并带有要传递的参数。
然后将此对象传递给线程。
功能也应相应修改。
如果你得到这个,你可能忘记把#include <thread>
放在文件的开头。 OP 的签名似乎应该可以工作。
在 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.