将多个参数传递给线程函数

时间:2012-05-07 18:15:38

标签: c++ multithreading visual-c++ c++11 visual-studio-2012

我有一个名为workForThread的函数,它接受两个参数,并返回void。我想使用类似的东西来编写这个函数:

thread(workForThread,a,b);

ab属于哪种类型。上面的代码没有编译,给出了“太多的调用参数”错误(“错误C2197:'void(__ cdecl *)(char *)':调用的参数太多了”)

我该如何解决这个问题?

注意:我查看了these two个问题,但那里的解决方案似乎对我不起作用。另外,我觉得有一种方法可以将它构建到c ++ 11中,这就是我要寻找的。

2 个答案:

答案 0 :(得分:13)

在C ++ 11中,执行此操作的方式或多或少与您尝试的方式相同:

std::thread myThread(workForThread,a,b);

提供的workForThread是一个(非成员)函数,它接受这两个参数。

答案 1 :(得分:7)

使用C ++ 11时,您可以使用lambda函数,该函数可以使用上下文的(非正式)参数。 “捕获”

这样的东西
void doIt (int a, int b) {  // do something, your workForThread
}

..
int a = 1;
int b = 2;

std:thread r ([=](){doIt (a, b); return 1;});

当只调用单个函数时,juanchopanza的答案可能会更高效,因为不会创建新函数。

lambda版本允许您配置更多。假设您正在启动线程,最终调用2个函数.juanchopanza方法将需要NAMED函数用于每个排列。

目前我认为两种方法的差异主要是品味问题。

如果您想了解有关lambda函数的更多信息

What is a lambda expression in C++11?