2017-04-01 68 views
0

如何命名一個線程被鎖定的情況,永久等待?我發現,什麼時候兩個線程碰撞,這就是所謂的幾個例子race conditionPosix線程鎖定:永久等待

A race condition occurs when two or more threads 
can access shared data and they try to 
change it at the same time 

但是,當一個線程是stuck waiting forever for another thread,沒有任何特定術語來命名這種情況,或者還它仍然被命名爲競爭條件,即使我們有兩個線程不會嘗試同時訪問共享數據,但是相反......其中一個線程被鎖定,永遠等待第二個線程?

+3

它被稱爲死鎖。 –

+1

..或可能活鎖,如果線程在100%的CPU。 – ThingyWotsit

+0

這取決於線程爲什麼在等待。如果線程1正在使用一個資源,然後開始等待另一個資源是空閒的,但是這個其他資源永遠不會被釋放,因爲線程2聲稱它正在等待資源線程1擁有,這就是死鎖(並有幾個版本的相同的東西,但他們都大致相同的想法)。如果其中一個線程在另一個線程中等待,另一個線程永遠不會因其他原因而結束(例如無限循環),這只是一個無限循環。 –

回答

0

如果Thread_1正在等待Thread_2,並且同時Thread_2正在等待Thread_1。這就是所謂的死鎖。當發生死鎖時,就像兩個線程相互爭奪。

另一種情況稱爲活鎖。活鎖只是有一個線程永遠等待另一個線程的情況。如果Thread_2正在等待Thread_1。而Thread_2想要從Thread_1獲得寫鎖。但是此時又出現了另一個Thread_3。 Thread_3也希望從Thread_1獲得寫入鎖定。不幸的是,Thread_3的優先級高於Thread_2。所以當Thread_1釋放寫鎖時。 Thread_3立即獲得了該寫鎖。並且出現了Thread_4,Thread_4與Thread_3具有相同的優先級...

Thread_2似乎永遠在等待寫鎖。這就是所謂的活鎖。 爲了避免這個問題,我們可以建立一個服務器隊列。哪個線程提前排隊,我們先處理那個更早的線程。

Pthread爲我們提供了鎖定資源的方式。我們可以使用互斥或​​其他的東西。但是我們在使用鎖之後必須解決這個問題。

您可以在併發控制中獲得關於此主題的更多信息。