多執行緒共同使用乙個鎖引發的死鎖問題

2021-08-13 17:53:19 字數 1304 閱讀 6945

今天大神同事遇到乙個問題,如下:

如果兩個執行緒共用乙個執行緒鎖,在a執行緒裡面申請兩次這個鎖,b執行緒裡釋放一次,那麼程式會正常執行嗎,還是會阻塞在某個地方?

場景1:時間片競爭,各執行緒對鎖的操作先後順序未知

[root@zxx ~/testcode]$./pthreadlock 

thread two count value is 1

unlock thread two count value is 1

thread one count value is 1

lock1 thread one count value is 2

測試結果如上所示:執行緒二先釋放鎖,執行緒1申請鎖成功,但是由於一直沒有釋放,因此在第二次申請鎖的地方等待

場景2:通過sleep讓執行緒1先申請鎖,執行緒二再釋放

[root@zxx ~/testcode]$./pthreadlock 

thread one count value is 1

lock1 thread one count value is 2

thread two count value is 2

unlock thread two count value is 2

lock2 thread one count value is 3

可以看到執行緒1先上鎖了,緊接著執行緒2釋放鎖,執行緒1又申請鎖,奇怪的是**並沒有在此等待鎖的再次釋放,正常執行完退出了。

對於鎖的使用有很多種,也可以通過設定執行緒鎖的性質來避免一些意外情況。經過進一步溝通,專案中的使用方式是在a執行緒傳送資料報,b執行緒收到資料報之後解鎖,那麼實際情況跟場景二類似。但是還是不太理解為什麼這麼使用執行緒鎖,唉,菜鳥乙隻,慢慢學習吧

附:例程

#include

#include

pthread_mutex_t mutex1 = pthread_mutex_initializer;  

int count = 0;  

void * thread_func_one(void *arg)  

void * thread_func_two(void *arg)  

int main ( int argc, char **argv)  

if( 0!=pthread_create( &thread_two, null, thread_func_two,null))  

pthread_join(thread_one, null);  

pthread_join(thread_two,null);  

return 0;  

}  

乙個模擬死鎖的多執行緒

package org.kevinlifeng public class testdeadlock implements runnable catch interruptedexception e t1嘗試鎖o2 可o2 已經被t2 給鎖住了還沒釋放,一直等待 synchronized o2 到了這...

Java多執行緒 手寫乙個死鎖的例子

下面是乙個多執行緒死鎖的例子 public class deadlockdemo private void deadlock catch interruptedexception e synchronized lock2 system.out.println thread1 end thread t...

乙個執行緒死鎖問題的分析

客戶報過來乙個問題,伺服器執行一周左右就會停止響應,有時候甚至兩天就不響應了,併發使用者量並不大,重啟服務後又工作正常。每當遇到這種問題時就有點兒棘手。一是這種問題的復現條件不好確定,另一方面,即使確定了條件,對於多執行緒的服務程式,也不好除錯。我遇到過的這種問題,大部分是靠讀 分析出來乙個可能的原...