日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

std::unique_lock与std::lock_guard区别示例

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 std::unique_lock与std::lock_guard区别示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

std::unique_lock也可以提供自動加鎖、解鎖功能,比std::lock_guard更加靈活。

std::lock_guard

std::lock_guard是RAII模板類的簡單實現,功能簡單。

1.std::lock_guard 在構造函數中進行加鎖,析構函數中進行解鎖。
2.鎖在多線程編程中,使用較多,因此c++11提供了lock_guard模板類;在實際編程中,我們也可以根據自己的場景編寫resource_guard?RAII類,避免忘掉釋放資源。

下面是一個使用std::lock_guard的代碼例子,1+2+ .. + 100的多線程實現,每個num只能由一個線程處理。:

#include <thread> #include <mutex> #include <vector> #include <iostream> #include <algorithm>std::mutex my_lock;void add(int &num, int &sum){while(true){std::lock_guard<std::mutex> lock(my_lock); if (num < 100){ //運行條件num += 1;sum += num;} else { //退出條件break;} } }int main(){int sum = 0;int num = 0;std::vector<std::thread> ver; //保存線程的vectorfor(int i = 0; i < 20; ++i){std::thread t = std::thread(add, std::ref(num), std::ref(sum));ver.emplace_back(std::move(t)); //保存線程} std::for_each(ver.begin(), ver.end(), std::mem_fn(&std::thread::join)); //joinstd::cout << sum << std::endl; }

std::unique_lock

類 unique_lock 是通用互斥包裝器,允許延遲鎖定、鎖定的有時限嘗試、遞歸鎖定、所有權轉移和與條件變量一同使用。
unique_lock比lock_guard使用更加靈活,功能更加強大。
使用unique_lock需要付出更多的時間、性能成本。

下面是try_lock的使用例子。

#include <iostream> // std::cout #include <thread> // std::thread #include <mutex> // std::mutex, std::unique_lock #include <vector>std::mutex mtx; // mutex for critical section std::once_flag flag;void print_block (int n, char c) {//unique_lock有多組構造函數, 這里std::defer_lock不設置鎖狀態std::unique_lock<std::mutex> my_lock (mtx, std::defer_lock);//嘗試加鎖, 如果加鎖成功則執行//(適合定時執行一個job的場景, 一個線程執行就可以, 可以用更新時間戳輔助)if(my_lock.try_lock()){for (int i=0; i<n; ++i)std::cout << c;std::cout << '\n';} }void run_one(int &n){std::call_once(flag, [&n]{n=n+1;}); //只執行一次, 適合延遲加載; 多線程static變量情況 }int main () {std::vector<std::thread> ver;int num = 0;for (auto i = 0; i < 10; ++i){ver.emplace_back(print_block,50,'*');ver.emplace_back(run_one, std::ref(num));}for (auto &t : ver){t.join();}std::cout << num << std::endl;return 0; }

參考

  • 自解鎖lock_guard_遠方-CSDN博客
  • std::unique_lock - cppreference.com

總結

以上是生活随笔為你收集整理的std::unique_lock与std::lock_guard区别示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。