Linux多線程的使用一:互斥鎖


  多線程經常會在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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM