[英]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_variable
和someMutex
。
如果兩個變量連接在一起對您的程序有意義,並且必須始終一起讀取或寫入,則互斥鎖可以使您做到這一點-您可以讀取/更改2個變量,而不是如上面的代碼所示讀取/寫入單個變量保持互斥時。 同樣,互斥鎖對這兩個變量一無所知,其影響全部在於代碼的結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.