執行緒基礎知識 C語言 Linux

2021-10-09 07:45:03 字數 2161 閱讀 4175

同乙個程序中的執行緒能共享程序中的絕大多數資源,當它們隨意競爭時可以導致資源會破壞、髒資料、不完整、不一致等問題。

通過一些方法讓程序在競爭資源時相互協調,避免出現資料不完全、不一致等問題,這就叫執行緒同步。

被多個執行緒同時訪問的**叫臨界區,被同時訪問的資源叫臨界資源。

中間不會打斷的操作叫原子操作。

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指令在訪問資料的時候,能一次讀取,而不需要...