多線程編程之線程同步互斥量
Pthread是 POSIX threads 的簡稱,是POSIX的線程標準。 Pthread線程同步指多個線程協調地,有序地同步使用共用資源。【C/C++多線程編程之五】pthread線程深入理解中講述到,多線程共用進程資源,一個線程訪問共用資源需要一段完整地時間才能完成其讀寫操作,如果在這段時間內被其他線程打斷,就會產生各種不可預知的錯誤。協調線程按一定的規則,不受打擾地訪問共用資源,保證正確性,這便是線程同步的出發點。 互斥量,是最簡單的線程同步機制,也是最常用的同步策略。 1.互斥量(mutex):
互斥量是一種線程同步對象,“互斥”的含義是同一時刻只能有一個線程獲得互斥量。一個互斥量對應一個共用資源,互斥量狀態:1.解鎖狀態意味著共用資源可用,2.加鎖狀態意味著共用資源不可用。 一個線程需要使用共用資源時,使用thread_mutex_lock申請:1.當互斥量為解鎖狀態,則佔用互斥量,並給互斥量加鎖,佔用資源(互相量為加鎖狀態,其他線程不能使用互斥量並等待互斥量變為解鎖狀態),2.如果互斥量為加鎖狀態,則線程等待,直到互斥量為解鎖狀態(其他線程使用完共用資源後會解鎖互斥量,釋放資源)。
2.互斥量基本函數: #include <pthread.h>
初始化互斥量:
int pthread_mutex_init(pthread_mutex *mutex,
const pthread_mutexattr_t* mutexattr); 該函數第一個參數為一個互斥量指標,第二個參數為互斥量屬性指標(一般設為NULL)。該函數將按照互斥量屬性對互斥量進行初始化。互斥量加鎖:
int pthread_mutex_lock(pthread_mutex *mutex); 該函數申請一個互斥量並對其進行加鎖,使該互斥量對其他線程不可用,讓其他申請互斥量的線程等待。
互斥量解鎖:
int pthread_mutex_unlock(pthread_mutex *mutex); 該函數對互斥量進行解鎖操作,使該互斥量對其他線程可以。
銷毀互斥量:
int pthread_mutex_destroy(pthread_mutex *mutex); 該函數銷毀一個不再需要的互斥量,釋放系統資源。 3.牛刀小試: 線程My_thread_1將共用資源字串Share寫成aaaaaaaa,線程My_thread_2則將其寫成eeeeeeee。 不啟用互斥量的情況下,兩個線程對共用資源的訪問是隨機並且無規律,相互幹擾打斷,產生a和e混合的字串,這顯然不是我們期望的結果。 啟用互斥量(去掉注釋)情況下,互斥量機制其作用,兩個線程同步協調地訪問共用資源Share,產生aaaaaaaa或eeeeeeee字串,符合我們的預期。 通過該樣本,讀者可以直觀地感受到互斥量的作用,親身體會互斥量機制,同時能讓讀者瞭解互斥量的內在原理。