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