用c ++

时间:2015-05-17 09:21:40

标签: 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;
}

帮我解决这个问题。

1 个答案:

答案 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);