Linux之執行緒 互斥量mutex與死鎖

2021-10-20 16:32:54 字數 1636 閱讀 7455

**主要內容:

(1)互斥量及如何使用

(2)什麼是死鎖,如何解決

(3)什麼是讀寫鎖,如何使用**

(4)條件變數實現的生產消費者模型

(5)訊號量實現的生產消費者模型

**執行緒同步**

協調步驟,順序執行。解決同步的問題:加鎖!

資料混亂的原因:

- 資源共享(獨享資源則不會);

- 隨機排程(意味著資料訪問會出現競爭);

- 執行緒間缺乏必要的同步機制。(解決該點最為可行,因此需要用到互斥量

**1.mutex互斥量**

兩個執行緒訪問同一塊共享資源,如果不協調順序,容易造成資料混亂。解決方法:加鎖--mutex

- pthread_mutex_init 初始化

- pthread_mutex_destroy 摧毀

- pthread_mutex_lock 加鎖

- pthread_mutex_unlock(pthread_mutex_t *mutex) 解鎖

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);

- restrict 約束該塊記憶體區域對應的資料,只能通過後面的變數進行訪問和修改

- mutex 互斥量--鎖

- attr 互斥量的屬性,可不考慮,傳null

互斥量的使用步驟:

- 初始化

- 加鎖

- 執行邏輯--操作共享資料

- 解鎖

注意事項:加鎖需要最小粒度,不要一直占用臨界區。

嘗試加鎖:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

#include#include#include#includepthread_mutex_t mutex;

void *thr(void *arg)

return null;

}int main()

sleep(1);

}return 0;

}

輸出:

~$ gcc mutex_trylock.c -lpthread

~$ ./a.out

hello world

ret = 16, srrmsg:device or resource busy

ret = 16, srrmsg:device or resource busy

ret = 16, srrmsg:device or resource busy

ret = 16, srrmsg:device or resource busy

ret = 16, srrmsg:device or resource busy

**2.死鎖**

(1)鎖了又鎖,自己加了一次鎖成功,又加了一次;

(2)交叉鎖。解決辦法:每個執行緒申請鎖的順序要一致;如果申請到一把鎖,申請另一把鎖的時候申請失敗,應該釋放已經掌握的。

Linux 多執行緒互斥量互斥

同乙個程序中的多個執行緒共享所在程序的記憶體資源,當多個執行緒在同一時刻同時訪問同一種共享資源時,需要相互協調,以避免出現資料的不一致和覆蓋等問題,執行緒之間的協調和通訊的就叫做執行緒的同步問題,執行緒同步的思路 讓多個執行緒依次訪問共享資源,而不是並行 mutex被建立時可以有初始值,表示mute...

Linux執行緒同步之互斥量(mutex)

互斥量 也稱為互斥鎖 出自posix 執行緒標準,可以用來同步同一程序中的各個執行緒。當然如果乙個互斥量存放在多個程序共享的某個記憶體區中,那麼還可以通過互斥量來進行程序間的同步。互斥量,從字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用於保護臨界區 共享資源 以保證在任何時刻只有乙個執行...

執行緒同步之互斥量

互斥量 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的檢視。當乙個執行緒修改變數時,而其他執行緒也可以讀取或者修改這個變數,就需要對這些執行緒同步,確保他們不會訪問到無效的變數 在變數修改時間多於乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...