UNIX環境高階程式設計 執行緒 死鎖詳解

2021-10-18 04:42:37 字數 1450 閱讀 4004

一、死鎖產生原因

執行緒對同乙個互斥量加鎖兩次,那麼它自身就會陷入死鎖狀態

多個互斥量,多個執行緒交叉請求訪問衝突。例如,程式中使用乙個以上的互斥量時,如果允許乙個執行緒一直占有第乙個互斥量,並且在試圖鎖住第二個互斥量時處於阻塞狀態,但是擁有第二個互斥量的執行緒也在試圖鎖住第乙個互斥量。因為兩個執行緒都在相互請求另乙個執行緒擁有的資源,所以這兩個執行緒都無法向前執行,於是就產生死鎖。

二、避免死鎖

仔細控制互斥量加鎖的順序(互斥量的層級關係)。例如,假設需要對兩個互斥量a和b同時加鎖。如果所有執行緒總是在對互斥量b加鎖之前鎖住互斥量a,那麼使用這兩個互斥量就不會產生死鎖(當然在其他的資源上仍可能出現死鎖)。

先釋放占有的鎖,然後過一段時間再試。可以使用pthread-mutex_trylock介面避免死鎖。

三、例項

#include

#include

#define nhash 29

#define hash(fp) (((unsigned long)fp)%nhash)

struct foo *fh[nhash]

;pthread_mutex_t hashlock = pthread_mutex_initializer;

struct foo

;struct foo *

foo_alloc

(void

) idx =

hash

(fp)

;pthread_mutex_lock

(&hashlock)

; fp->f_next = fh[idx]

; fh[idx]

= fp->f_next;

pthread_mutex_lock

(&fp->f_lock)

;pthread_mutex_unlock

(&hashlock)

;/* ... continue initialization ... */

}return

(fp);}

void

foo_hold

(struct foo *fp)

struct foo *

foo_find

(int id)

}pthread_mutex_unlock

(&hashlock)

;return

(fp);}

void

foo_rele

(struct foo *fp)

else

pthread_mutex_unlock

(&hashlock)

;pthread_mutex_destroy

(&fp->f_lock)

;free

(fp);}

else

}

在學習中進步,如有錯誤,請多多批評指正

unix環境高階程式設計 執行緒解析

1 通過為每種事件型別分配單獨的處理執行緒,可以簡化處理非同步事件的 2 多個程序必須使用作業系統提供的複雜機制才能實現記憶體和檔案描述符的共享,而多個執行緒自動地可以訪問相同的儲存位址空間和檔案描述符 3 互動的程式可以通過使用多執行緒來改善響應時間,多執行緒可以把程式中處理使用者輸入輸出的部分與...

Unix環境高階程式設計筆記 11 執行緒

1 執行緒概念 執行緒包含了表示程序內執行環境必須的資訊,其中包括程序中標識執行緒的執行緒id 一組暫存器值 棧 排程優先順序和策略 訊號遮蔽字 errno變數以及執行緒私有資料。程序的所有資訊對該程序的所有執行緒都是共享的,包括可執行的程式文字 程式的全域性記憶體和堆記憶體 棧以及檔案描述符。2 ...

unix環境高階程式設計

unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...