在c ++中实现线程

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)

帮我处理这件事.

el.*_*ado 6

这是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)