天天看點

linux 互斥鎖銷毀_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++的使用環境中,通常為了友善使用,會去封裝一下:

linux 互斥鎖銷毀_Linux多線程的使用一:互斥鎖

1 classCMutex

2 {

3 public:

4 CMutex()

5 {

6 mutex =PTHREAD_MUTEX_INITIALIZER;

7 }

8 ~CMutex(){}

9 voidLock()

10 {

11 pthread_mutex_lock(&mutex);

12 }

13 voidUnlock()

14 {

15 pthread_mutex_unlock(&mutex);

16 }

17 private:

18 pthread_mutex_t mutex;

19 };

linux 互斥鎖銷毀_Linux多線程的使用一:互斥鎖

還有較常用的方式是封裝成自動鎖,當這個對象建立的時候上鎖;當執行到這個對象的作用域外,對象銷毀,自動解鎖。

linux 互斥鎖銷毀_Linux多線程的使用一:互斥鎖

1 classCAutoMutex

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 };

簡介

編輯

非阻塞的鎖定互斥鎖pthread_mutex_trylock

頭檔案

編輯

#include

函數體

編輯

int pthread_mutex_trylock( pthread_mutex_t *mutex );

傳回值

函數成功傳回0。任何其他傳回值都表示錯誤。

函數pthread_mutex_trylock是pthread_mutex_lock的非阻塞版本。如果mutex參數所指定的互斥鎖已經被鎖定的話,調用pthread_mutex_trylock函數不會阻塞目前線程,而是立即傳回一個值來描述互斥鎖的狀況。

else

{//printf("fun111 mut1 %d pth :: %u\n", (int)str, s);

pthread_mutex_unlock(&mut1);

usleep(1000);

}

pthread_mutex_trylock()調用在參數mutex指定的mutex對象目前被鎖住的時候立即傳回,除此之外,pthread_mutex_trylock()跟pthread_mutex_lock()功能完全一樣。

pthread_mutex_trylock() 在成功獲得了一個mutex的鎖後傳回0,否則傳回一個錯誤提示碼錯誤.

pthread_mutex_trylock() 函數在以下情況會失敗:

[EBUSY] The mutex could not be acquired because it was already locked. mutex已經被鎖住的時候無法再擷取鎖

The pthread_mutex_lock(), pthread_mutex_trylock() and pthread_mutex_unlock() functions may fail if:

[EINVAL] mutex指向的mutex未被初始化

[EAGAIN] Mutex的lock count(鎖數量)已經超過 遞歸索的最大值,無法再獲得該mutex

需要注意的是,隻有確定在pthread_mutex_trylock()調用成功時,即傳回值為0時,才能去解鎖它。