2016-11-08 52 views
0

我是新來的多線程,我極其困難地圍繞互斥排斥我。使用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的訪問權限?

P.S.假設我已經在其自己之前宣佈了someMutex

P.P.S.我有一種感覺,這個問題可能很廣泛,但是再一次,這不應該是因爲我問的是某些確實有特定答案的東西(如果我錯了,請糾正我)。

+1

Mutex首先被描述爲像孩子們的遊戲,「Button Button,它的按鈕」。如果您有Button,則只允許「觸摸」「共享資源」......互斥鎖是Button,當您的pthread_mutex_lock()成功時,您將獲得它(按邏輯)。然後您可以「閱讀」或「修改」共享資源。完成後,您可以「解鎖」互斥鎖,從而使其可用於其他線程。注意:這是一個簡單/初學者/不完整的描述,但它應該讓你開始。 – TonyB

+0

哦那麼在這種情況下,我可以說使用相同的互斥鎖來鎖定不同的變量嗎?說我可以調用pthread_mutex_lock(&someMutex)來鎖定myVariable和你的變量嗎?由於互斥體並不是特定於某個特定變量(或來自您所說的資源),我應該可以使用一個互斥體來處理我的程序中的所有內容嗎? – posixKing

+2

例如,您可以使用一個互斥鎖來控制對所有全局變量的所有訪問......您必須考慮所有線程可能需要訪問由互斥鎖保護的共享資源的頻率......這是多少個設計決策您需要的互斥體以及它們將鎖定的內容。 – TonyB

回答

0

互斥體,並保護不被互斥知道什麼之間的關聯,也沒有它必須是嗎?假設我們有兩個合作的人,他們需要共享一輛汽車。我們不希望一個人在他人使用汽車時嘗試使用汽車。他們可以制定一個簡單的規則 - 除非你拿着紅蘿蔔,否則不要弄髒車子。由於只有一個人可以拿着蕪菁,確保他們在嘗試使用汽車時不會相互衝突。蘿蔔不必知道它是「保護」汽車。只要他們兩人都離開汽車,除非他們是拿着蕪菁的人,蕪菁保護汽車。

互斥體是蘿蔔。鎖定互斥鎖可保持蘿蔔,等到其他人將其放下(如果需要的話)。解鎖互斥將其他人可以獲得的蕪菁放入其中。

互斥體保護的變量或對象是汽車。蘿蔔保護車不是來自蘿蔔的任何事情,而是來自遵守規則的所有人,除非你有蘿蔔,否則不要碰車。同上保護對象的互斥體。

+0

不需要蘿蔔來保護汽車。有一個更簡單的規則:除非你在駕駛座位上,否則不要開車。但我可以舉出一個與現實生活中類似的例子:我聽說過許多開發人員想要在某些共享文件中進行更改的軟件項目。他們會有一頂特殊的帽子,掛在項目經理的辦公室,而且規則是,除非戴帽子,否則不要編輯文件。 –

1

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

一般順序概念

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

unlock(someMutex) { 
    someMutex = 0; 
} 
0

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

互斥鎖是一個基本的構建模塊,它是你的責任來應用它來獲得所需的結果。

如果你想改變一個共享變量,你可以這樣做:

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

這部分意味着只有1在一個時間線程將執行互斥的鎖定/解鎖之間的代碼。這是爲了確保

  • 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個變量。同樣,互斥對這兩個變量一無所知,其影響全在於代碼的結構。