c++ 将多个参数传递到std::thread

bzzcjhmw  于 2023-02-20  发布在  其他
关注(0)|答案(4)|浏览(213)

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

但是它抱怨说没有这样的构造函数,一种解决方法是定义一个结构来封装参数,但是有没有其他的方法呢?

q3qa4bjr

q3qa4bjr1#

你实际上只是在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();

你也可以分离线程,如果你不知道连接和分离之间的区别,阅读线程。

qybjjes1

qybjjes12#

有同样的问题。我传递了一个自定义类的非常量引用,构造函数抱怨(一些元组模板错误)。用指针替换引用,它工作了。

aurhwmvo

aurhwmvo3#

如果错误消息显示

error: no matching constructor for initialization of 'std::thread'

那么很可能是因为您忘记将C标准指定为11。对于g编译器:

g++ std=c++11 main.cpp -o main
eimct9ow

eimct9ow4#

如果你得到这个,你可能忘记了把#include <thread>放在文件的开头,OP的签名看起来应该可以工作。

相关问题