多執行緒中使用lambda
在本篇文章中,主要介紹lamb程式設計客棧da函式在多執行緒中的使用。
先從下面的例子開始吧:
#include
#include
int main()
); std::cout << "main thread\n";
t.join();
return 0;
}在此基礎上我們將建立5個執行緒,然後把執行緒放進乙個vector容器中, 用for_eaqspubbch()完成執行緒的匯合(join):
#include
#include
#include
#include
int main()
)); }
std::cout << "main thread\n";
// 通過 for_each 迴圈每乙個執行緒
// 第三個引數賦值乙個task任務
// 符號''會告訴編譯器我們正在用乙個匿名函式
// lambda函式將它的引數作為執行緒的引用t
// 然後乙個乙個的join
std::for程式設計客棧.begin(), workers.end(), (std::thread &t;)
);return 0;
}輸出應該像這樣:
thread function
thread function
thread function
thread function
thread function
main thread
vector容器包含個工作執行緒,然後在它們結束任務之後,與主線程匯合。
併發程式設計的不確定性
從上面的輸出中可以看出,我們無法分辨哪乙個執行緒在列印。
因此,我們需要在每個執行緒上新增乙個標記。鑑於我們使用lambda,所以我們可以嘗試下它的捕獲能力。
通過將i的值傳遞給執行緒,使用[i]我們可以將索引傳遞到執行緒函式中:
for (int i = 0; i < 5; i++)
));}
輸出:thread function thread function thread function thread function thread function
main thread42
103每次執行的輸出可能不同,這體現了併發程式設計的不確定性性質。
此外,我們可以從輸出中看到,甚至在列印語句之間,也可以是搶占式的,換句話說,排程程式可以隨時中斷。
因此,由於當前程式設計的性質,我們使用lambda捕獲特性的努力沒有成功。
本文標題: c++11/14 執行緒中使用lambda函式的方法
本文位址:
C 11 14 執行緒中使用Lambda函式
include include int main std cout main thread n t.join return 0 在此基礎上我們將建立5個執行緒,然後把執行緒放進乙個vector容器中,用for each 完成執行緒的匯合 join include include include in...
c 11 14 多執行緒要點彙總
在c 11以前,c 的多執行緒程式設計均需依賴系統或第三方介面實現,一定程度上影響了 的移植性。c 11中,引入了boost庫中的多執行緒部分內容,形成c 標準,形成標準後的boost多執行緒程式設計部分介面基本沒有變化,這樣方便了以前使用boost介面開發的使用者切換使用c 標準介面,很容易把bo...
C 11 14特性備忘
template auto add t x,u y int array for auto x array include 建構函式列表初始化 class magic magic magic std vector int v 普通函式形參 void func std initializer list ...