繁体   English   中英

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

[英]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::joinstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM