问题描述
在调用std::thread
的构造函数时,您传递了一个函数及其所需的参数。 std::thread
如何确定要传递给函数的参数总数?
#include <iostream>
#include <thread>
void task(int i,char c,bool b)
{
return;
}
int main(int argc,char** argv)
{
std::thread t(task,10,'c',true); // these 3 arguments
t.join();
}
解决方法
std::thread
constructor使用variadic template实现:
template< class Function,class... Args >
explicit thread( Function&& f,Args&&... args );
位置:
-
Function
是线程将调用的可调用对象的类型(无论是函数,lambda,函子等)。 -
Args
是args
可变参数中的类型列表。 -
f
是线程将调用的实际可调用对象。 -
args
是将传递给f
的值的列表。
std::thread
可以使用参数包扩展将args
转发到f
,将{em>相似转发到f(args...);
。编译器本身而非std::thread
会将args...
扩展为实际值,即:f(arg1,arg2,...,argN)
。
因此,std::thread t(task,10,'c',true);
将创建一个工作线程,该线程与f(args...)
进行调用,它们被扩展为task(10,true)
。
因此,您传递给std::thread
构造函数的参数必须与您传递的f
可调用参数相匹配,否则代码将无法编译。
template< class Function,Args&&... args );
如您所见,第一个参数是要运行的函数,其余的是要传递给它的参数。如果不匹配,则会出现某种编译器错误