Ahm*_*eem 0 c++ multithreading
我正在尝试用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;
}
Run Code Online (Sandbox Code Playgroud)
帮我处理这件事.
这是std::thread 构造函数的签名(在facti中它是一个模板函数):
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
Run Code Online (Sandbox Code Playgroud)
这意味着你必须提供一个Callable(即你可以使用的任何东西()).fun是可调用的,因为它是一个函数.但是,表达式fun(arr)不是,因为它表示应用于参数的函数,其中yelds类型void(返回类型fun).而且,在表达式中,thread(fun)您的函数不会被调用.它被传递给新创建的线程然后执行.如果表达式thread(fun(arr))有效,则在创建新线程之前fun(arr)将计算表达式,并且线程将仅获得结果,而不是函数本身.fun(arr)
但C++标准库已经涵盖了你.前面提到的构造函数有一个参数包(即一个可变长度的参数列表)args,它可以让你为线程函数提供参数.所以你应该使用:
thread t2(fun, arr);
Run Code Online (Sandbox Code Playgroud)