Linux執行緒同步 讀寫鎖

2021-07-15 10:52:06 字數 2406 閱讀 8695

讀寫鎖和互斥量(互斥鎖)很類似,是另一種執行緒同步機制,但不屬於posix標準,可以用來同步同一程序中的各個執行緒。當然如果乙個讀寫鎖存放在多個程序共享的某個記憶體區中,那麼還可以用來進行程序間的同步.

和互斥量不同的是:互斥量會把試圖進入已保護的臨界區的執行緒都阻塞;然而讀寫鎖會視當前進入臨界區的執行緒和請求進入臨界區的執行緒的屬性來判斷是否允許執行緒進入。

相對互斥量只有加鎖和不加鎖兩種狀態,讀寫鎖有三種狀態:讀模式下的加鎖,寫模式下的加鎖,不加鎖。

讀寫鎖的使用規則:

只要沒有寫模式下的加鎖,任意執行緒都可以進行讀模式下的加鎖;

只有讀寫鎖處於不加鎖狀態時,才能進行寫模式下的加鎖;

讀寫鎖也稱為共享-獨佔(shared-exclusive)鎖,當讀寫鎖以讀模式加鎖時,它是以共享模式鎖住,當以寫模式加鎖時,它是以獨佔模式鎖住。讀寫鎖非常適合讀資料的頻率遠大於寫資料的頻率從的應用中。這樣可以在任何時刻執行多個讀執行緒併發的執行,給程式帶來了更高的併發度.

讀寫鎖的生成與銷毀

#include int pthread_rwlock_init(pthread_rwlock_t *restrictrwlock ,const pthread_rwlockattr_t *restrict attr );

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock );

成功返回0, 失敗返回錯誤號

pthread_rwlock_init對讀寫鎖做初始化,引數attr 用於設定mutex 屬性。如果用pthread_rwlock_initializer 初始化全域性或者靜態mutex, 那它相當於用pthread_rwlock_init 初始化時attr 為null。

讀寫鎖的使用

#include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );  //讀時加鎖

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock ); //寫時加鎖

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock ); //釋放鎖

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock );

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock );

int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict abs_timeout);

int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict abs_timeout);

成功返回0, 失敗返回錯誤號

try類函式加鎖:如果獲取不到鎖,會立即返回錯誤ebusy!

timed類函式加鎖:如果規定的時間內獲取不到鎖,會返回etimedout錯誤!

讀寫鎖使用例項

#include #include #include #include #include #include #include #include #define max_session_num     1000

int current_session_num = 0;

pthread_rwlock_t session_rwlock = pthread_rwlock_initializer;

int rand_num()

void *get_session_func(void *arg)

else if (current_session_num == 0)

else

pthread_rwlock_unlock(&session_rwlock);

sleep(rand_num());

}return (void *)-1;

}void *write_session_func(void *arg)

else

pthread_rwlock_unlock(&session_rwlock);

sleep(rand_num());

}return (void *)-1;

}void *remove_session_func(void *arg)

else

pthread_rwlock_unlock(&session_rwlock);

sleep(rand_num());

}return (void *)-1;

}int main(int argc, char **argv)

linux執行緒同步之讀寫鎖

讀寫鎖與互斥量類似,不過讀寫鎖的並行性更高。讀寫鎖可以有三種狀態 1 讀模式加鎖 2 寫模式加鎖 3 不加鎖。在寫加鎖狀態時,在解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問許可權。但是如果執行緒希望以寫模式加鎖,它必須阻塞,直至...

Linux執行緒同步之讀寫鎖

讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1.當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2.當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行...

Linux執行緒同步讀寫鎖 rwlock

讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1.當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2.當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行...