将多个参数传递给线程函数
Posted
技术标签:
【中文标题】将多个参数传递给线程函数【英文标题】:Passing multiple arguments to a threaded function 【发布时间】:2012-05-07 18:15:37 【问题描述】:我有一个名为 workForThread 的函数,它接受两个参数并返回 void。我想使用类似的东西来线程这个函数:
thread(workForThread,a,b);
其中a
和b
是适当的类型。上面的代码没有编译,给出“too many arguments for call”错误(“error C2197: 'void (__cdecl *)(char *)' : too many arguments for call”)
我该如何解决这个问题?
注意:我查看了thesetwo 问题,但那里的解决方案似乎对我不起作用。此外,我觉得有一种方法可以在 c++11 中内置,这就是我正在寻找的。p>
【问题讨论】:
C++11 线程有一个(模板化的)构造函数可以做到这一点。 那么为什么它会给我这个错误? 你有什么版本的VS?也许它不支持。 不熟悉VS,但我认为那个版本应该可以工作,而且我认为错误信息看起来很奇怪。您正在使用的函数的签名是什么? 投票结束,因为真正的问题在于 OP 没有向我们展示的代码。 【参考方案1】:在 C++11 中,这样做的方式或多或少是您尝试过的方式:
std::thread myThread(workForThread,a,b);
提供的 workForThread 是一个接受这两个参数的(非成员)函数。
【讨论】:
也许补充一点,函数可能不会被重载。我认为这就是他的问题所在。 @bamboon 你是什么意思没有超载? 假设你有 workforthread(int, int) 和 workforthread(int) 那么这不会编译。 @bamboon 也不会有任何其他代码使用两个参数调用该函数。 OP 说“我有一个名为 workForThread 的函数,它接受两个参数,并返回 void。”。【参考方案2】:使用 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 版本允许您进行更多配置。假设您正在启动线程,最终调用 3 个函数中的 2 个函数。juanchopanza 方法需要为每个排列命名函数。
目前,我认为这两种方法的区别主要是品味问题。
当您想了解有关 lambda 函数的更多信息时
What is a lambda expression in C++11?
【讨论】:
你能告诉我你的意思吗?我没有使用 c++ lambdas 的经验 现在可以编译,但在“__declspec(noinline) void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)”中出现致命错误,知道是什么原因造成的吗? 在 C++11 中绝对不需要 lambda 函数。 可能 lambda 需要一个虚拟返回值 @stefanbachert 这无关紧要,你真的不需要这里的 lambda。这完全没有意义。以上是关于将多个参数传递给线程函数的主要内容,如果未能解决你的问题,请参考以下文章