目錄
? 基本用法:保護共享計數器
✅ 輸出示例:
?️ 更推薦的寫法:使用std::lock_guard
? 關鍵點總結:
? 小貼士:什麼時候用mutex?
首頁 後端開發 C++ c Mutex示例

c Mutex示例

Aug 03, 2025 am 08:43 AM
c++ mutex

std::mutex用於保護共享資源以防止數據競爭,示例中通過std::lock_guard自動加鎖和解鎖確保多線程安全;1. 使用std::mutex和std::lock_guard可避免手動管理鎖帶來的異常風險;2. 共享變量如計數器在多線程修改時必須用互斥量保護;3. 推薦RAII風格的鎖管理以確保異常安全;4. 避免死鎖需按固定順序獲取多個鎖;5. 任何多線程訪問共享資源場景都應使用互斥量同步,最終程序正確輸出Expected: 10000和Actual: 10000。

C   mutex example

在C 多線程編程中, std::mutex是用來保護共享資源、防止多個線程同時訪問造成數據競爭的重要工具。下面是一個簡單的std::mutex使用示例,展示如何用它來安全地在多個線程中修改共享變量。

C   mutex example

? 基本用法:保護共享計數器

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

std::mutex mtx; // 定義一個互斥量int counter = 0; // 共享資源:計數器void increment(int n) {
    for (int i = 0; i < n; i) {
        mtx.lock(); // 加鎖counter; // 訪問共享資源(臨界區)
        mtx.unlock(); // 解鎖}
}

int main() {
    const int num_threads = 10;
    const int inc_per_thread = 1000;

    std::vector<stdhread> threads;

    // 創建多個線程for (int i = 0; i < num_threads; i) {
        threads.emplace_back(increment, inc_per_thread);
    }

    // 等待所有線程完成for (auto& t : threads) {
        t.join();
    }

    std::cout << "Expected: " << num_threads * inc_per_thread << std::endl;
    std::cout << "Actual: " << counter << std::endl;

    return 0;
}

✅ 輸出示例:

 Expected: 10000
Actual: 10000

如果沒有mutex ,實際結果很可能小於10000,因為多個線程可能同時讀寫counter ,導致競爭條件。


?️ 更推薦的寫法:使用std::lock_guard

手動調用lock()unlock()容易出錯(比如異常導致unlock 沒執行)。推薦使用RAII風格的std::lock_guard ,自動管理鎖的生命週期。

C   mutex example
 void increment(int n) {
    for (int i = 0; i < n; i) {
        std::lock_guard<std::mutex> lock(mtx); // 自動加鎖,作用域結束自動解鎖counter;
    }
}

這樣即使在臨界區發生異常,也能保證鎖被正確釋放。


? 關鍵點總結:

  • std::mutex用於保護共享數據。
  • 永遠不要在持有鎖時做耗時或可能拋異常的操作。
  • 優先使用std::lock_guardstd::unique_lock而不是手動lock/unlock
  • 避免死鎖:多個鎖要按固定順序獲取。

? 小貼士:什麼時候用mutex?

當你有多個線程:

C   mutex example
  • 讀寫同一個全局變量
  • 修改同一個容器(如std::vector , std::map
  • 寫日誌、寫文件等共享I/O 資源

就需要用mutex來同步訪問。


基本上就這些。簡單但容易忽略細節,用好lock_guard是關鍵。

以上是c Mutex示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

Rimworld Odyssey溫度指南和Gravtech
1 個月前 By Jack chen
Rimworld Odyssey如何釣魚
1 個月前 By Jack chen
我可以有兩個支付帳戶嗎?
1 個月前 By 下次还敢
初學者的Rimworld指南:奧德賽
1 個月前 By Jack chen
PHP變量範圍解釋了
3 週前 By 百草

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1603
29
PHP教程
1506
276
C在矢量示例中查找 C在矢量示例中查找 Aug 02, 2025 am 08:40 AM

在C 中查找vector元素最常用的方法是使用std::find,1.使用std::find配合迭代器範圍和目標值進行查找,通過比較返回的迭代器是否等於end()來判斷是否找到;2.對於自定義類型或複雜條件,應使用std::find_if並傳入謂詞函數或lambda表達式;3.查找字符串等標準類型時直接傳入目標字符串即可;4.每次查找時間複雜度為O(n),適用於小規模數據,頻繁查找應考慮使用std::set或std::unordered_set,該方法簡單有效且廣泛適用於各類查找場景。

Succinct(PROVE幣)是什麼?如何運作?PROVE代幣經濟與價格預測 Succinct(PROVE幣)是什麼?如何運作?PROVE代幣經濟與價格預測 Aug 06, 2025 pm 06:42 PM

目錄什麼是Succinct(PROVE)誰創建了Succinct(PROVE)?哪些風險投資支持Succinct(PROVE)? Succinct(PROVE)的工作原理SP1zkVM和Prover網絡OPSuccinct技術跨鏈驗證PROVE代幣經濟學代幣詳情代幣分配代幣實用程序潛在代幣持有者PROVE代幣價格預測PROVE代幣的上市前交易活動社區對PROVE代幣價格的預測為什麼要選擇Succinct? Succ

C char數組到字符串示例 C char數組到字符串示例 Aug 02, 2025 am 05:52 AM

答案是:使用std::string構造函數可將char數組轉換為std::string,若數組含中間'\0'則需指定長度。 1.對於以'\0'結尾的C風格字符串,直接用std::stringstr(charArray);即可完成轉換;2.若char數組包含中間'\0'但需轉換前N個字符,應使用std::stringstr(charArray,length);明確指定長度;3.處理固定大小數組時確保其以'\0'結尾再轉換;4.可用str.assign(charArray,charArray strl

什麼是正確的啟動。用於在Linux上使用GDB調試C應用程序的JSON設置? 什麼是正確的啟動。用於在Linux上使用GDB調試C應用程序的JSON設置? Aug 04, 2025 am 03:46 AM

todebugac Application usinggdbinvisualStudiocode,configureTheLaunch.jsonFileCortly; keySettingSincludEstIncifyingTheexecutableWithWith program“ program”,將“ mimode”設置為“ gdb”和“ gdb”和“ type” type“ type” ty ty ty ty'cppdbg'to'cppdbg'ex

c Mutex示例 c Mutex示例 Aug 03, 2025 am 08:43 AM

std::mutex用於保護共享資源以防止數據競爭,示例中通過std::lock_guard自動加鎖和解鎖確保多線程安全;1.使用std::mutex和std::lock_guard可避免手動管理鎖帶來的異常風險;2.共享變量如計數器在多線程修改時必須用互斥量保護;3.推薦RAII風格的鎖管理以確保異常安全;4.避免死鎖需按固定順序獲取多個鎖;5.任何多線程訪問共享資源場景都應使用互斥量同步,最終程序正確輸出Expected:10000和Actual:10000。

迭代時從矢量擦除 迭代時從矢量擦除 Aug 05, 2025 am 09:16 AM

刪除元素時若正在迭代,必須避免使用失效迭代器。 ①正確做法是使用it=vec.erase(it),利用erase返回的有效迭代器繼續遍歷;②批量刪除推薦“erase-remove”慣用法:vec.erase(std::remove_if(vec.begin(),vec.end(),條件),vec.end()),安全且高效;③可使用反向迭代器從後往前刪除,邏輯清晰但需注意條件方向。結論:始終用erase返回值更新迭代器,禁止對已失效迭代器執行 操作,否則導致未定義行為。

C自動關鍵字示例 C自動關鍵字示例 Aug 05, 2025 am 08:58 AM

theAutokeywordInc decteStheTypeOfavariable fromitsInitializer,makecodecleanerandmoraintableable.1.itredreducesverbosity,尤其是withcomplextypeslikeiterators.2.itenhancesmaintainabilitionalobilitybyautaperaimatoragationalaimatoragationalapationalabilationalabilationalapationalapationalabilabilationalabilationalapationalabilationalapationalablemaintartaptingtopypechanges.3.ithicalemenderarefornelect

C標籤調度示例 C標籤調度示例 Aug 05, 2025 am 05:30 AM

TagDispatching通過類型標籤在編譯期選擇最優函數重載,實現高效多態。 1.使用std::iterator_traits獲取迭代器類別標籤;2.定義多個do_advance重載函數,分別處理random_access_iterator_tag、bidirectional_iterator_tag和input_iterator_tag;3.主函數my_advance根據推導出的標籤類型調用對應版本,確保編譯期決策無運行時開銷;4.該技術被標準庫如std::advance採用,支持擴展自定義

See all articles