4

我想用 lambda 函数调用一个方法(对于这个例子 std::thread 构造函数),传递 int 值:

int a=10;

std::thread _testThread = thread([a](int _a){
  //do stuff using a or _a ?
});
_testThread.detach();

我不知道如何正确编写这样的函数,我收到此错误:C2064: term does not evaluate to a functiontaking 0 arguments

4

3 回答 3

11

std::thread接受一个可调用对象以及传递给它的任何参数。如果您不提供参数,std::thread将尝试不带参数调用该对象,因此会出现错误。

如果你需要一个参数:

std::thread _testThread{[a](int _a) {
    std::cout << a << ' ' << _a; //prints main's a, followed by somethingThatWillBe_a
}, somethingThatWillBe_a};

如果您只是想使用main's a,它已经被捕获:

std::thread _testThread{[a] {
    std::cout << a; //prints main's a
}};

如果您认为需要分离线程,我还建议您格外小心。如果有任何加入线程的可能性,那就去吧。

于 2014-08-27T21:10:29.753 回答
4

您可以通过int a以下两种方式之一访问。要么将它作为参数传递给线程的构造函数,要么在 lambda 的闭包中捕获它:

int a=10;

// pass in a as a parameter
std::thread _testThread1([](int _a){

  //do stuff using a or _a ?

}, a); // pass a to the parameter _a
_testThread1.detach();

// capture a in the closure
std::thread _testThread2([a](){ // capture a

  //do stuff using a or _a ?

});
_testThread2.detach();
于 2014-08-27T21:15:45.067 回答
2

如果您只想将一些值传递给 lambda 函数,请查看下面的代码:

int main()
{
    int a = 10;

    [](int arg)
    {
        cout << "arg = " << arg << endl;
    }
    (a);

    return 0;
}

如果您想使用 lambda 函数创建线程并向其传递一些参数,请参见下一个代码示例:

int main()
{
    int a = 10;

    thread thd([](int arg) { cout << "arg = " << arg << endl; }, a);

    thd.join();

    return 0;
}
于 2014-08-27T21:32:43.600 回答