多執行緒程式設計 互斥量

2022-06-18 11:06:08 字數 1690 閱讀 6311

pthreads 使用 pthread_mutex_t 型別的變數來表示互斥量,同時在使用互斥量進行同步前需要先對它進行初始化,可以用靜態或動態的方式對互斥量進行初始化。

對於靜態分配的 pthread_mutex_t 變數來說,只要將 pthread_mutex_initializer賦給變數就行了。

pthread_mutex_t mutex = pthread_mutex_initializer;
對於動態分配或者不使用預設屬性的互斥變數來說,需要呼叫 pthread_mutex_int()函式來執行初始化工作。 pthread_mutex_int()函式原型如下:

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
引數 mutex 是乙個指向要初始化的互斥量的指標;引數 attr 傳遞 null 來初始化乙個帶有預設屬性的互斥量,否則就要用類似於執行緒屬性物件所使用的方法,先建立互斥量屬性物件,再用該屬性物件來建立互斥量。

函式成功返回 0,否則返回乙個非 0 的錯誤碼, 表 13.5 列出 pthread_mutex_init 出錯的錯誤碼。

靜態初始化程式通常比呼叫 pthread_mutex_init 更有效,而且在任何執行緒開始執行之前,確保變數被初始化一次。

銷毀互斥量使用 pthread_mutex_destroy()函式,原型如下:

int pthread_mutex_destroy(pthread_mutex_t *mutex);
引數 mutex 指向要銷毀的互斥量。以下**銷毀了 mylock 互斥量:

int

error;

pthread_mutex_t mylock;

if (error = pthread_mutex_destroy(&mylock))

fprintf(stderr,

"failed to destroy mylock : %s\n

",strerror(error));

pthreads 中有兩個試圖鎖定互斥量的函式, pthread_mutex_lock()和 pthread_mutex_trylock()。pthread_mutex_lock()函式會一直阻塞到互斥量可用為止,而 pthread_mutex_trylock()則嘗試加鎖, 但通常會立即返回。函式原型如下:

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

pthread_mutex_unlock()函式用來釋放指定的互斥量。函式原型如下:

int pthread_mutex_unlock(pthread_mutex_t *mutex);
當多個執行緒需要相同的一些鎖, 但是按照不同的順序加鎖, 死鎖就很容易發生, 如果能確保所有的執行緒都是按照相同的順序獲得鎖,那麼死鎖就不會發生。 例如,規定程式內有三個互斥鎖的加鎖順序為 mutexa->mutexb->mutexc,則執行緒 t1、 t2、 t3 執行緒操作偽**如下所示:

Linux 多執行緒互斥量互斥

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

多執行緒 共享互斥量

就像之前我們提過的一樣,很多執行緒需要互斥量進行相互鎖定,因為很多關鍵資料和操作並不是執行緒安全,多執行緒處理很有可能會出很大的問題。但是互斥量又會帶來乙個問題,我就舉個例子來說明 比如說,現在有一組資料,可以對它進行讀寫操作。但是一般情況讀寫要分開操作,因為這樣才可以讓後續處理更好的執行。很明顯的...

c 多執行緒 互斥量

我們在做程式時,有時候希望在一台電腦上面只有乙個程序例項在執行,利用mutex互斥量可以實現了這個功能,方法及步驟如下 接下來分控制台程式和winform程式兩種情況下實現此功能 1.控制台程式 csharp view plain copy using system using system.col...