Linux多執行緒的使用一:互斥鎖

林堯彬發表於2020-04-04

  多執行緒經常會在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 };

 

轉載於:https://www.cnblogs.com/leon08/p/4084077.html

相關文章