同乙個程序中的執行緒能共享程序中的絕大多數資源,當它們隨意競爭時可以導致資源會破壞、髒資料、不完整、不一致等問題。
通過一些方法讓程序在競爭資源時相互協調,避免出現資料不完全、不一致等問題,這就叫執行緒同步。
被多個執行緒同時訪問的**叫臨界區,被同時訪問的資源叫臨界資源。
中間不會打斷的操作叫原子操作。
pthread_mutex_t 是一種資料型別,可以定義變數
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
功能:初始化互斥量,也可以使用pthread_mutex_initializer初始化,預設處於開鎖狀態。
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:對互斥量加鎖,成功則繼續執行,失敗則阻塞,直到互斥量解鎖,才返回。
int pthread_mutex_trylock(pthread_mutex_t *mutex);
功能:嘗試對互斥量加鎖,成功(0)或失敗(ebusy)都立即返回。
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:對互斥量解鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:銷毀互斥量
與xsi中的訊號量原理相同,執行緒之間所使用的計數器,用於控制訪問有限的共享資源的執行緒數。
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化訊號量
sem:被初始化的訊號量
pshared:
0 只能在程序內使用
非0 表示該訊號量可以用共享記憶體的方式,多個程序共享(linux不支援)。
value:訊號量的初始值
int sem_wait(sem_t *sem);
功能:對號量減1,如果不夠減則阻塞
int sem_trywait(sem_t *sem);
功能:對訊號量減1,成功(0)或失敗(eagain)都立即返回
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
功能:對訊號量減,如果不夠減則等待abs_timeout時間,超時後返回(etimedout)。
int sem_post(sem_t *sem);
功能:對訊號量加1。
int sem_destroy(sem_t *sem);
功能:銷毀訊號量
多個程序或執行緒互相等待對方的資源,在得到新的資源之前不會釋放自己的資源,這樣就形成了迴圈等待,這種現象被稱為死鎖。
資源互斥
資源只有兩種狀態,只有可用和不可用兩狀態,不能同時使用,同一時刻只能被乙個程序或執行緒使用。
占有且請求
已經得到資源的程序或執行緒,繼續請求新的資源,並持續占有舊的資源。
資源不可剝奪
資源已經分配程序或執行緒後,不能被其它程序或執行緒強制性獲取,除非資源的佔有者主動釋放。
環路等待
死鎖發生時,系統中必定有兩個或兩個以上的程序或執行緒組成一條等待環路。
破壞互斥條件
想辦法讓資源能夠共享使用。
缺點受環境或資金的影響無法讓資源共享。
破壞占用且請求條件
採用預先靜態分配的方法,程序或執行緒在執行前一次申請所有資源,在資源沒有滿足前不投入執行。
缺點系統資源會被嚴重浪費,因為有些資源可能開始時使用,而有些資源結束時才使用。
破壞不可剝奪條件
當乙個程序或執行緒已經占有乙個不可剝奪的資源時,請求新資源時無法滿足,則釋放已經占有的資源,一段時間後再重新申請。
缺點該策略實現起來比較複雜,釋放已經獲取資源可能會導致前一階段的工作失效,反覆的申請釋放資源會增加系統開銷,占用cpu和暫存器、記憶體等資源。
破壞迴圈等待條件
給每個資源進行編號,程序或執行緒按照順序請求資源,只有拿到前一外資源,才能繼續請求下乙個資源。
缺點資源的編號必須相對穩定,資源新增或銷毀時會受到影響。
死鎖一旦產生基本無解,現在的作業系統無法解決死鎖,因此我們只能防止死鎖產生。
Linux下C語言基礎知識
1 源程式的編譯 gcc o hello hello.c gcc表示我們使用gcc來編譯我們的源程式,o選項表示我們要求編譯器給我們輸出的可執行檔名為hello o選項表示我們要求輸出的可執行檔名。c選項表示我們只要求編譯器輸出目標 而不必要輸出可執行檔案。g選項表示 我們要求編譯器在編譯的時候提供...
C語言基礎知識
1 的問題。int i 1 int j 2 int k i j printf d k 輸出k為3。編譯原理有關編譯器在詞法解析的時候,對於運算子,總是查詢最大的匹配也就是說,i j,編譯器在找到 的時候,它不立即理解為 而是繼續下乙個字元,下乙個字元仍然是 可以組成 再往下的話便是 不成立了。所以i...
C語言基礎知識
一 位元組對齊 位元組對齊的原因,是機器在訪問記憶體中儲存的資料的高效性。通常機器是機器位數為自然邊界來訪問記憶體的,如果乙個4位元組整形數,所在的記憶體不在虛擬記憶體的自然邊界。則cpu需要讀多於一次的資料,這樣就降低了效率。所以,簡單地說,就是保證cpu指令在訪問資料的時候,能一次讀取,而不需要...