将多个参数传递给std :: thread

时间:2013-12-03 00:46:08

标签: c++ multithreading c++11

我问的是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);

但它抱怨说没有这样的构造函数。解决这个问题的一种方法是定义一个包装参数的结构,但还有另一种方法吗?

5 个答案:

答案 0 :(得分:48)

你真的只是在std::thread(func1,a,b,c,d);中传递它们,如果对象存在则应该编译它们,但是出于另一个原因它是错误的。由于没有创建对象,因此无法加入或分离线程,程序将无法正常工作。因为它是一个临时的,所以析构函数会被立即调用,因为线程没有被连接或分离,但是调用了std::terminate。在温度被销毁之前,您可以std::joinstd::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();

    }