簡體   English   中英

使用pthread_mutex_lock鎖定資源是什么意思?

[英]What does it mean to lock a resource using pthread_mutex_lock?

我是多線程技術的新手,我很難克服相互排斥的問題。

這是pthread_mutex_lock的原型

int pthread_mutex_lock(pthread_mutex_t *mutex);

手冊頁指出, The mutex object referenced by mutex shall be locked by calling pthread_mutex_lock().

首先,我的理解是您使用互斥鎖來鎖定共享資源,以便在任何時候只有一個線程可以訪問它。 為了爭辯,我們假設共享資源是一個名為myVariable的全局變量。 現在,如果我們要鎖定myVariable,我應該能夠使用鎖定機制來鎖定myVariable ,但是鎖定mutex object意味着什么? 我的意思是,如果我調用pthread_mutex_lock(&someMutex) ,我是在鎖定myVariable還是其他?

所有地說,如果我想使用互斥,應該不是我能夠做類似pthread_mutex_lock(myVariable)而不是做pthread_mutex_lock(&someMutex)

另外,這個someMutex對象如何對應於myVariable? 這個someMutex對象如何鎖定對myVariable訪問?

PS假設我之前已經聲明過someMutex

PPS我覺得這個問題可能很廣泛,但那又不應該,因為我要問的是實際上有特定答案的東西(如果我錯了,請糾正我)。

互斥鎖不知道互斥鎖及其保護的對象之間的關聯,也不必一定如此。 假設我們有兩個正在合作的人,他們需要共享汽車。 我們不希望一個人在另一人使用汽車時嘗試使用它。 他們可以制定一條簡單的規則-除非您拿着紅色蘿卜,否則不要弄亂汽車。 由於只有一個人可以握住蘿卜,因此請確保他們在嘗試使用汽車時不會互相沖突。 蘿卜不必知道它在“保護”汽車。 只要他們倆都獨自離開汽車,除非他們都是蘿卜,那蘿卜就保護了汽車。

互斥量是蘿卜。 鎖定互斥體將保持蘿卜,直到需要時其他人將其放下。 解鎖互斥鎖可以將蘿卜放置在其他人可以獲取的地方。

互斥對象保護的變量或對象是汽車。 蘿卜保護汽車不是來自於蘿卜所做的任何事情,而是來自每個遵守該規則的人,除非您擁有蘿卜,否則請勿觸摸汽車。 互斥體保護對象的同上。

someMutex基本上只是一個數字變量,它不直接對應於myVariable

一般順序概念

lock(someMutex) {
    while (someMutex != 0) {}
    someMutex = 1;
}

unlock(someMutex) {
    someMutex = 0;
}

互斥鎖保護代碼區域,因此一次僅一個執行線程將一次執行該區域。

互斥鎖是基本的構建塊,應用此互斥鎖以獲得所需的結果是您的責任。

如果要更改共享變量,可以執行以下操作:

void changeit(int val)
{
    pthread_mutex_lock(&someMutex);
    global_variable = val;
    pthread_mutex_unlock(&someMutex);
}

這部分意味着在互斥鎖的鎖定/解鎖之間,一次只能有一個線程執行該代碼。 這是為了確保

  • global_variable = val; 是原子運行的,例如,如果同時運行2個賦值,則不能保證結果將是任何有意義的值(不能保證單個賦值語句是原子執行的,或者是匯編/機器代碼中的1條指令)

  • 讀取global_variable的任何人都將完全在更改它之前或之后進行此操作,因此他們不會看到更改中存在任何不一致的值。

這也意味着在鎖定同一個互斥鎖的同時,其他訪問(讀取和/或寫入)global_variable的人也必須這樣做(例如,讀取變量),您可以執行以下操作:

int readit(void)
{
    int val;
    pthread_mutex_lock(&someMutex);
    val = global_variable;
    pthread_mutex_unlock(&someMutex);
    return val;
}

所以, someMutex對應global_variable只有在代碼編寫的方式,它依賴於你,程序員,正確地做到這一點-之間不存在內在聯系global_variablesomeMutex

如果兩個變量連接在一起對您的程序有意義,並且必須始終一起讀取或寫入,則互斥鎖可以使您做到這一點-您可以讀取/更改2個變量,而不是如上面的代碼所示讀取/寫入單個變量保持互斥時。 同樣,互斥鎖對這兩個變量一無所知,其影響全部在於代碼的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM