首頁 > 後端開發 > C++ > 互斥體如何防止多執行緒程式中的資料損壞?

互斥體如何防止多執行緒程式中的資料損壞?

Patricia Arquette
發布: 2024-11-20 15:38:13
原創
547 人瀏覽過

How do Mutexes Prevent Data Corruption in Multithreaded Programs?

互斥體範例與演練

在多執行緒程式設計中,互斥體在協調對共享資源的存取方面發揮著至關重要的作用。然而,理解它們的功能對於初學者來說可能具有挑戰性。讓我們使用類比和範例程式來深入研究簡化的解釋。

類比:電話亭

想像一條擁擠的街道,只有一個公用電話亭。多個人(線程)想要使用電話(共享資源),但一次只能有一個人在裡面(互斥)。為了防止混亂,安裝了門把手(互斥鎖)。

當第一個人進入展位並抓住把手時,他們就在互斥鎖上建立了鎖。這向其他人表明該資源正在使用中。當人在裡面時,沒有其他人可以抓住句柄,因為它被鎖定(互斥)。

執行緒與互斥體互動

在多執行緒程式中,執行緒代表我們比喻中的人。互斥體是控制共享資源的存取的變數。為了保護資源,執行緒必須先取得互斥鎖,這會阻止其他執行緒存取該資源。

一旦執行緒獲得了鎖,它就可以獨佔地存取該資源。當它完成時,它釋放鎖,允許另一個執行緒取得它。這可以防止同時存取共享資源,從而導致資料損壞。

範例程式

這是一個簡單的C 11 範例,示範了互斥體的工作原理:

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

std::mutex m;
int i = 0;

void makeACallFromPhoneBooth()
{
    m.lock();
    std::cout << i << " Hello Wife" << std::endl;
    i++;
    m.unlock();
}

int main()
{
    std::thread man1(makeACallFromPhoneBooth);
    std::thread man2(makeACallFromPhoneBooth);
    std::thread man3(makeACallFromPhoneBooth);

    man1.join();
    man2.join();
    man3.join();
}
登入後複製

在此範例中,變數m 用作互斥體。它確保一次只有一個執行緒可以使用共享變數 i。如果沒有互斥鎖,多個執行緒可能會同時修改 i,導致結果不準確。

鎖定語法

語法 pthread_mutex_lock(&mutex1) 取得互斥鎖上的鎖命名為互斥體1。這向其他執行緒發出訊號,表示受互斥鎖保護的程式碼區域目前已鎖定。

執行緒需要了解鎖定區域,以便在鎖定時避免存取它們。如果一個執行緒試圖存取一個鎖定的區域,它將被阻塞,直到鎖被釋放。

結論

互斥鎖是多執行緒程式設計中必不可少的機制,確保共享以受控和同步的方式存取資源。了解它們的功能對於避免資料損壞和實現高效的多執行緒至關重要。

以上是互斥體如何防止多執行緒程式中的資料損壞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板