我正在尝试使用c ++中的线程维护两个函数(Visual Studio支持#include库),当我运行没有参数的函数时它运行正常但是使用参数会弹出错误。 代码是:
void fun(char a[])
{}
int main()
{
char arr[4];
thread t1(fun);
//(Error 1 error C2198: 'void (__cdecl *)(int [])' : too few arguments for call)
thread t2(fun(arr));
//Error 1 error C2664: std::thread::thread(std::thread &&) throw()' :
//cannot convert parameter 1 from'void' to 'std::thread &&'
//Second Error is 2 IntelliSense: no instance of constructor
// "std::thread::thread" matches the argument list argument types are: (void
return 0;
}
帮我解决这个问题。
答案 0 :(得分:6)
这是std::thread
constructor的签名(因为它是模板函数):
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
这意味着您必须提供Callable
(即您可以使用()
的任何内容)。 fun
是可调用的,因为它是一个函数。但是,表达式fun(arr)
不是,因为它表示应用于参数的函数,其中yelds类型为void
(返回类型为fun
)。此外,在表达式thread(fun)
中,您的函数不被调用。它被传递给新创建的线程,然后执行。如果表达式thread(fun(arr))
有效,则表达式fun(arr)
将在创建新线程之前计算,并且线程将仅获得fun(arr)
的结果,而不是函数本身。
但是C ++标准库已经为您提供了帮助。前面提到的构造函数有一个名为args
的参数包(即可变长度的参数列表),它允许您为线程函数提供参数。所以你应该使用:
thread t2(fun, arr);