死鎖
- 1. 死鎖的兩種情況
- 2. 模擬死鎖程式
- 3. 程式呼叫堆疊資訊
1. 死鎖的兩種情況
- 兩種情況:
- 在
多執行緒程式中,多個執行緒使用同一個互斥鎖時,其中一個執行緒``拿到了互斥鎖之后,但是一直不釋放互斥鎖,導致其他執行緒一直阻塞在加鎖的函式內部,這種現象是死鎖現象 - 在
多執行緒程式中,程式中有兩個互斥鎖分別為互斥鎖A和互斥鎖B、程式運行中,執行緒1拿到了互斥鎖A,執行緒B拿到了互斥鎖B,執行緒1和執行緒2都不釋放各自的互斥鎖,同時還想要申請拿對方的互斥鎖,此時兩個執行緒都阻塞在拿對方互斥鎖的函式內部,這種現象也是死鎖現象
2. 模擬死鎖程式
- 執行緒1拿到互斥鎖A,一直不釋放互斥鎖A
- 執行緒2拿到互斥鎖B,一直不釋放互斥鎖B
- 執行緒1申請互斥鎖B
- 執行緒2申請互斥鎖A
- 兩個執行緒都
阻塞在pthread_mutex_lock函式中的lock_wait中
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t lockA = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lockB = PTHREAD_MUTEX_INITIALIZER;
void* task1(void* arg)
{
pthread_mutex_lock(&lockA);
sleep(2); //防止一個執行緒執行過快 把鎖都拿到了
pthread_mutex_lock(&lockB);
return NULL;
}
void* task2(void* arg)
{
pthread_mutex_lock(&lockB);
sleep(2);
pthread_mutex_lock(&lockA);
return NULL;
}
int main()
{
pthread_t thread1,thread2;
int ret_th1 = pthread_create(&thread1,NULL,task1,NULL);
int ret_th2 = pthread_create(&thread2,NULL,task2,NULL);
if(ret_th1<0 && ret_th2<0)
{
perror("pthread_create");
return -1;
}
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
pthread_mutex_destroy(&lockA);
pthread_mutex_destroy(&lockB);
return 0;
}
3. 程式呼叫堆疊資訊

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/246931.html
標籤:其他
