一、兩種使用方式:
1.靜態方式:
pthread_mutex_t mtx = pthread_mutex_initializer;
2.動態方式:
#include
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
returns 0 on success, or a positive error number on error
使用動態方式的場景:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
要求已經解鎖,destroy後不會再使用,在記憶體釋放前執行destroy。
二、加解鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict abs_timeout);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
如果其他執行緒已經加鎖,而本執行緒再呼叫pthread_mutex_lock,則阻塞住直到另乙個執行緒解鎖。
如果任意執行緒已經加鎖,而本執行緒再呼叫
pthread_mutex_trylock,會返回ebusy。
呼叫pthread_mutex_timedlock,如果等超時了還未獲得鎖,會返回etimedout。
pthread_mutex_normal
pthread_mutex_errorcheck,速度執行慢,用於除錯階段:
linux上可能只支援pthread_mutex_errorcheck_np
pthread_mutex_recursive:
linux上可能只支援pthread_mutex_recursive_np
pthread_mutex_default。pthread_mutex_init的attr為null或者靜態型別。在linux上和pthread_mutex_normal相同操作。
linux執行緒還提供了nonstandard static initializers foreach of the above mutex types (e.g., pthread_recursive_mutex_initializer_np),為了可移植,避免使用。
三、避免死鎖的方法:
linux使用的不同:
條件變數:摘自freediameter。
static void core_state_set(enum core_state newstate)
static int core_state_wait(enum core_state waitstate)
pthread_cleanup_pop( 0 );
check_posix( pthread_mutex_unlock( &core_mtx ));
return ret; }
執行緒間通訊《互斥鎖,讀寫鎖》
1 互斥鎖 為了保護共享資源,使我們執行緒可以單獨使用這個共享資源,使用之前先上鎖,那其他程序要使用的時候,就需要等待到這個執行緒用完之後,需要開鎖。互斥鎖的使用 幫助文件預設沒有安裝,我們需要手動安裝 sudo apt get install manpages posix dev 宣告這個互斥鎖 ...
執行緒間同步機制 互斥鎖
互斥以排他方式防止共享資料被併發修改。互斥量從本質來說是一把鎖,是乙個二元變數,其狀態為開鎖 允許0 和上鎖 禁止1 在訪問共享資源前對互斥量進行設定 加鎖 在訪問完成後釋放 解鎖 互斥量。1 在訪問該資源前,首先申請該互斥鎖,如果該互斥鎖處於開鎖狀態,則申請到該鎖物件,並立即占有該鎖 使該鎖處於鎖...
Linux執行緒間同步 互斥鎖Mutex
程序間通訊往往意味著系統呼叫,核心態,使用者態的切換,其代價是不容忽視的。而執行緒是程序中的具體執行流,乙個程序中多個執行緒共享程序的資源,包含程序的虛擬位址空間,程序開啟的檔案描述符,程序組id等。而執行緒間的通訊和同步由於處於同一位址空間下,也更加輕易和輕量級。多執行緒之間訪問共享變數時,這些共...