**主要內容:
(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 執行緒標準,可以用來同步同一程序中的各個執行緒。當然如果乙個互斥量存放在多個程序共享的某個記憶體區中,那麼還可以通過互斥量來進行程序間的同步。互斥量,從字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用於保護臨界區 共享資源 以保證在任何時刻只有乙個執行...
執行緒同步之互斥量
互斥量 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的檢視。當乙個執行緒修改變數時,而其他執行緒也可以讀取或者修改這個變數,就需要對這些執行緒同步,確保他們不會訪問到無效的變數 在變數修改時間多於乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...