多執行緒經常會在Linux的開發中用到,我想把平時的使用和思考記錄下來,一是給自己做個備忘,二是分享給可能會用到的人。
POSIX標準下互斥鎖是pthread_mutex_t,與之相關的函式有:
1 int pthread_mutex_init(pthread_mutex_t * mutex , pthread_mutexattr_t * attr); 2 int pthread_mutex_destroy (pthread_mutex_t * mutex); 3 int pthread_mutex_lock (pthread_mutex_t * mutex ); 4 int pthread_mutex_unlock (pthread_mutex_t * mutex ); 5 int pthread_mutex_trylock (pthread_mutex_t * mutex );
初始化鎖用pthread_mutex_init,也可以用pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER(普通鎖,最常見)來初始化;銷燬用pthread_mutex_destroy,Linux中互斥鎖並不佔用資源,所以不去銷燬也可以。一旦互斥鎖被鎖住了(pthread_mutex_lock),另一個地方再呼叫pthread_mutex_lock,就會被阻塞住,直到有pthread_mutex_unlock來解鎖這個互斥鎖,以此來保證多執行緒執行的有序性。pthread_mutex_trylock不會被阻塞住,如果當前互斥鎖被鎖住了,pthread_mutex_trylock會返回一個異常值;如果沒被鎖住,就去鎖定之,和pthread_mutex_lock效果一樣。我感覺trylock在平時並不常用,最常用的還是初始化,lock,unlock,因為Linux下鎖不去銷燬也可以,所以destory用的也不多。
在C++的使用環境中,通常為了方便使用,會去封裝一下:
1 class CMutex 2 { 3 public: 4 CMutex() 5 { 6 mutex = PTHREAD_MUTEX_INITIALIZER; 7 } 8 ~CMutex(){} 9 void Lock() 10 { 11 pthread_mutex_lock(&mutex); 12 } 13 void Unlock() 14 { 15 pthread_mutex_unlock(&mutex); 16 } 17 private: 18 pthread_mutex_t mutex; 19 };
還有較常用的方式是封裝成自動鎖,當這個物件建立的時候上鎖;當執行到這個物件的作用域外,物件銷燬,自動解鎖。
1 class CAutoMutex 2 { 3 public: 4 CAutoMutex() 5 { 6 mutex = PTHREAD_MUTEX_INITIALIZER; 7 pthread_mutex_lock(&mutex); 8 } 9 ~CAutoMutex() 10 { 11 pthread_mutex_unlock(&mutex); 12 } 13 private: 14 pthread_mutex_t mutex; 15 };