我有一个名为workForThread的函数,它接受两个参数,并返回void。我想使用类似的东西来编写这个函数:
thread(workForThread,a,b);
a
和b
属于哪种类型。上面的代码没有编译,给出了“太多的调用参数”错误(“错误C2197:'void(__ cdecl *)(char *)':调用的参数太多了”)
我该如何解决这个问题?
注意:我查看了these two个问题,但那里的解决方案似乎对我不起作用。另外,我觉得有一种方法可以将它构建到c ++ 11中,这就是我要寻找的。 p>
答案 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函数的更多信息