多線程經常會在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 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 };
還有較常用的方式是封裝成自動鎖,當這個對象建立的時候上鎖;當執行到這個對象的作用域外,對象銷毀,自動解鎖。
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時,才能去解鎖它。