日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C++多線程中的互斥鎖

來源: 責編: 時間:2024-06-24 09:11:39 156觀看
導讀在多線程編程中,互斥鎖(mutex)是確保線程安全、避免數據競爭的重要工具。C++標準庫提供了多種互斥鎖,每種都有其特定的應用場景和特點。主要有以下幾種互斥鎖(Mutex):std::mutex:最基本的互斥鎖,用于保護臨界區,確保同一時間只

在多線程編程中,互斥鎖(mutex)是確保線程安全、避免數據競爭的重要工具。C++標準庫提供了多種互斥鎖,每種都有其特定的應用場景和特點。jX528資訊網——每日最新資訊28at.com

jX528資訊網——每日最新資訊28at.com

主要有以下幾種互斥鎖(Mutex):jX528資訊網——每日最新資訊28at.com

  • std::mutex:最基本的互斥鎖,用于保護臨界區,確保同一時間只有一個線程可以訪問被保護的資源。
  • std::timed_mutex:支持超時機制的互斥鎖,可以嘗試在給定時間內鎖定互斥鎖。如果在指定時間內沒有成功獲取鎖,則返回失敗。
  • std::recursive_mutex:遞歸互斥鎖,同一線程可以多次獲取鎖而不會發生死鎖,通常用于遞歸函數中。
  • std::recursive_timed_mutex:支持超時機制的遞歸互斥鎖,結合了遞歸鎖和超時鎖的特性。
  • std::shared_mutex(C++17 引入):允許多個線程同時讀取,但只有一個線程可以寫入。適用于讀多寫少的場景。
  • std::shared_timed_mutex(C++17 引入):支持超時機制的共享互斥鎖,可以在給定時間內嘗試獲取讀鎖或寫鎖。

這些是C++標準庫中提供的幾種主要的互斥鎖類型。每種鎖都有其特定的應用場景和使用方法,選擇合適的互斥鎖類型對于實現高效、安全的多線程程序非常重要。jX528資訊網——每日最新資訊28at.com

一、基本互斥鎖(std::mutex)

std::mutex是最基本的互斥鎖,主要用于保護臨界區,確保同一時間只有一個線程可以訪問共享資源。jX528資訊網——每日最新資訊28at.com

特點:jX528資訊網——每日最新資訊28at.com

  • 簡單易用,適用于大多數場景。
  • 不能遞歸鎖定,同一線程多次嘗試鎖定會導致死鎖。

示例代碼:jX528資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <mutex>std::mutex mtx;void print_thread_id(int id) {    std::lock_guard<std::mutex> lock(mtx); // 自動管理鎖的獲取和釋放    std::cout << "Thread ID: " << id << std::endl;}int main() {    std::thread t1(print_thread_id, 1);    std::thread t2(print_thread_id, 2);    t1.join();    t2.join();    return 0;}

jX528資訊網——每日最新資訊28at.com

二、帶超時機制的互斥鎖(std::timed_mutex)

std::timed_mutex在std::mutex的基礎上增加了超時功能,允許線程在指定時間內嘗試獲取鎖,如果在超時時間內未成功獲取鎖,則返回失敗。jX528資訊網——每日最新資訊28at.com

特點:jX528資訊網——每日最新資訊28at.com

  • 適用于需要設置鎖獲取超時時間的場景。
  • 提供try_lock_for和try_lock_until兩種超時嘗試獲取鎖的方法。

示例代碼:jX528資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <mutex>#include <chrono>std::timed_mutex tmtx;void try_to_lock(int id) {    if(tmtx.try_lock_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " locked the mutex" << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(200));        tmtx.unlock();    } else {        std::cout << "Thread " << id << " could not lock the mutex" << std::endl;    }}int main() {    std::thread t1(try_to_lock, 1);    std::thread t2(try_to_lock, 2);    t1.join();    t2.join();    return 0;}

jX528資訊網——每日最新資訊28at.com

三、遞歸互斥鎖(std::recursive_mutex)

std::recursive_mutex允許同一線程多次獲取鎖而不會發生死鎖,這對于遞歸函數或需要多次鎖定的場景非常有用。jX528資訊網——每日最新資訊28at.com

特點:jX528資訊網——每日最新資訊28at.com

  • 適用于遞歸調用和需要多次鎖定的場景。
  • 需要注意避免濫用,因為遞歸鎖的使用會增加鎖定次數的復雜性。

示例代碼:jX528資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <mutex>std::recursive_mutex rmtx;void recursive_function(int depth) {    rmtx.lock();    std::cout << "Depth: " << depth << std::endl;    if (depth > 0) {        recursive_function(depth - 1);    }    rmtx.unlock();}int main() {    std::thread t(recursive_function, 5);    t.join();    return 0;}

jX528資訊網——每日最新資訊28at.com

四、帶超時機制的遞歸互斥鎖(std::recursive_timed_mutex)

std::recursive_timed_mutex結合了std::recursive_mutex和std::timed_mutex的特性,支持遞歸鎖定和超時機制。jX528資訊網——每日最新資訊28at.com

特點:jX528資訊網——每日最新資訊28at.com

  • 適用于遞歸調用和需要超時機制的場景。
  • 提供超時嘗試獲取遞歸鎖的方法。

示例代碼:jX528資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <mutex>#include <chrono>std::recursive_timed_mutex rtmmtx;void try_recursive_lock(int id, int depth) {    if (rtmmtx.try_lock_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " locked at depth " << depth << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(50));        if (depth > 0) {            try_recursive_lock(id, depth - 1);        }        rtmmtx.unlock();    } else {        std::cout << "Thread " << id << " could not lock at depth " << depth << std::endl;    }}int main() {    std::thread t1(try_recursive_lock, 1, 3);    std::thread t2(try_recursive_lock, 2, 3);    t1.join();    t2.join();    return 0;}

jX528資訊網——每日最新資訊28at.com

五、共享互斥鎖(std::shared_mutex)

std::shared_mutex允許多個線程同時讀取,但只有一個線程可以寫入。這在讀多寫少的場景下非常有用。jX528資訊網——每日最新資訊28at.com

特點:jX528資訊網——每日最新資訊28at.com

  • 適用于讀多寫少的場景。
  • 讀操作和寫操作使用不同的鎖定機制。

示例代碼:jX528資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <shared_mutex>std::shared_mutex shmtx;void read_shared(int id) {    std::shared_lock<std::shared_mutex> lock(shmtx); // 共享鎖    std::cout << "Thread " << id << " is reading" << std::endl;    std::this_thread::sleep_for(std::chrono::milliseconds(100));}void write_shared(int id) {    std::unique_lock<std::shared_mutex> lock(shmtx); // 獨占鎖    std::cout << "Thread " << id << " is writing" << std::endl;    std::this_thread::sleep_for(std::chrono::milliseconds(100));}int main() {    std::thread readers[5], writer(write_shared, 1);    for (int i = 0; i < 5; ++i) {        readers[i] = std::thread(read_shared, i + 2);    }    writer.join();    for (auto& reader : readers) {        reader.join();    }    return 0;}

jX528資訊網——每日最新資訊28at.com

六、帶超時機制的共享互斥鎖(std::shared_timed_mutex)

std::shared_timed_mutex結合了std::shared_mutex和std::timed_mutex的特性,支持超時機制。jX528資訊網——每日最新資訊28at.com

特點:jX528資訊網——每日最新資訊28at.com

  • 適用于讀多寫少且需要超時機制的場景。
  • 提供超時嘗試獲取共享鎖的方法。

示例代碼:jX528資訊網——每日最新資訊28at.com

#include <iostream>#include <thread>#include <shared_mutex>#include <chrono>std::shared_timed_mutex shtmmtx;void try_read_shared(int id) {    if (shtmmtx.try_lock_shared_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " is reading" << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(50));        shtmmtx.unlock_shared();    } else {        std::cout << "Thread " << id << " could not read" << std::endl;    }}void try_write_shared(int id) {    if (shtmmtx.try_lock_for(std::chrono::milliseconds(100))) {        std::cout << "Thread " << id << " is writing" << std::endl;        std::this_thread::sleep_for(std::chrono::milliseconds(50));        shtmmtx.unlock();    } else {        std::cout << "Thread " << id << " could not write" << std::endl;    }}int main() {    std::thread readers[5], writer(try_write_shared, 1);    for (int i = 0; i < 5; ++i) {        readers[i] = std::thread(try_read_shared, i + 2);    }    writer.join();    for (auto& reader : readers) {        reader.join();    }    return 0;}

jX528資訊網——每日最新資訊28at.com

總結

C++標準庫提供了多種類型的互斥鎖,每種鎖都有其特定的用途和特點。選擇合適的互斥鎖類型可以有效提高程序的并發性能和安全性。jX528資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-95917-0.htmlC++多線程中的互斥鎖

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go 1.23:擁抱iter包,簡化你的迭代邏輯

下一篇: C++ vs Rust vs Go 性能比較

標簽:
  • 熱門焦點
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
  • 滴滴違法違規被罰80.26億 共存在16項違法事實

    滴滴違法違規被罰80.26億 存在16項違法事實開始于2121年7月,歷經一年時間,網絡安全審查辦公室對“滴滴出行”網絡安全審查終于有了一個暫時的結束。據“網信
Top 主站蜘蛛池模板: 句容市| 长顺县| 秦安县| 昭平县| 郑州市| 江阴市| 赤峰市| 余庆县| 新野县| 山西省| 民县| 六盘水市| 车险| 开化县| 西华县| 年辖:市辖区| 清水河县| 桐城市| 彭泽县| 南昌县| 建德市| 邳州市| 台东县| 六盘水市| 丰宁| 商城县| 和林格尔县| 尚志市| 浦江县| 武清区| 纳雍县| 庆安县| 马公市| 松溪县| 行唐县| 扎赉特旗| 拜城县| 定陶县| 湘乡市| 密云县| 西乌珠穆沁旗|