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

soa*_*dos 7 c++ multithreading visual-c++ c++11 visual-studio-2012

我有一个名为workForThread的函数,它接受两个参数,并返回void.我想使用类似的东西来修改此函数:

thread(workForThread,a,b);
Run Code Online (Sandbox Code Playgroud)

在哪里ab在适当的类型.上面的代码没有编译,给出了"太多的调用参数"错误("错误C2197:'void(__ cdecl*)(char*)':调用的参数太多了"

我该如何解决这个问题?

注意:我已经看过 两个问题,但那里的解决方案对我来说似乎不起作用.另外,我觉得有一种方法可以在c ++ 11中内置它,这就是我要找的东西.

jua*_*nza 13

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

std::thread myThread(workForThread,a,b);
Run Code Online (Sandbox Code Playgroud)

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


ste*_*ert 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;});
Run Code Online (Sandbox Code Playgroud)

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

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

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

当您想要阅读有关lambda函数的更多信息时

什么是C++ 11中的lambda表达式?

  • @stefanbachert它无关紧要,你真的不需要这里的lambda.这完全没有意义. (2认同)