2014-08-27 54 views
1

我要调用的方法(在这个例子中的std ::线程构造函数) 与拉姆达函数,传递int值:如何用参数编写lambda函数? C++

int a=10; 

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

我不知道如何正确地写这样的功能,我得到这个错误: C2064:术语不评估为取值为0的函数

+0

你必须捕捉'_a',为您捕捉'了'。 – juanchopanza 2014-08-27 21:08:59

+0

好吧,我只需要在该线程中的'a'。 – 2014-08-27 21:10:11

+0

这就是一个lambda函数 – 2014-08-27 21:10:20

回答

5

std::thread需要可调用对象以及任何传递给它的参数。如果您没有提供参数,std::thread将尝试不带任何参数地调用该对象,从而导致错误。

如果你需要一个参数:

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

如果你只是想使用maina,它已经拍摄:

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

我也建议是,如果你超级小心认为你需要分离一个线程。如果有任何加入线程的可能性,那就去做吧。

2

您可以通过以下两种方式之一访问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(); 
1

如果你只是想通过一些价值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; 
}