2014-08-27 55 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; 
}