1. 程式人生 > >多執行緒lambda資料捕獲

多執行緒lambda資料捕獲

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的好處是可以保留某個時刻的狀態,這是其他方式無法做到的。

另一個更加