執行緒間互斥鎖

2021-06-17 18:02:24 字數 1754 閱讀 6697

一、兩種使用方式:

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等。而執行緒間的通訊和同步由於處於同一位址空間下,也更加輕易和輕量級。多執行緒之間訪問共享變數時,這些共...