多執行緒lambda資料捕獲
阿新 • • 發佈:2019-01-13
lambda
函式的執行是在真正呼叫的時候,這和普通函式沒有太大區別,只是lambda
沒有實際的名稱而已。lambda
的另一個特點是可以捕獲周圍的變數,捕獲的方式分為值和引用。
捕獲的是立刻發生的,而不是等到函式呼叫的時候,只要宣告一個lambda而且聲明瞭捕獲,那麼捕獲的動作就會發生。但是注意,如果是傳遞引用,那麼得到的結果是不確定的,因為引用只是原來變數的一個別名,這也是非常危險的行為。
給出程式碼例項,多執行緒處理,先宣告兩個lambda,不立刻呼叫,但是捕獲卻立刻發生了。
#include <iostream>
#include <thread>
int main() {
int a = 0;
auto fun1 = [a]() { // 函式未呼叫,但是發生了捕獲
std::cout << "sub thread, res = " << a << std::endl;
};
auto fun2 = [&a]() { // 函式未呼叫,但是發生了捕獲
std::cout << "sub thread value, res = " << a << std::endl;
};
++a;
std:: cout << "main thread reference, res = " << a << std::endl;
// 以下才是真正執行lambda
std::thread t1(fun1);
std::thread t2(fun2);
t1.join();
t2.join();
return 0;
}
輸出:
main thread reference, res = 1
sub thread, res = 0
sub thread value, res = 1
使用lamda的好處是可以保留某個時刻的狀態,這是其他方式無法做到的。
另一個更加