歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> UNIX環境高級編程:線程同步之互斥量

UNIX環境高級編程:線程同步之互斥量

日期:2017/3/3 15:19:58   编辑:Unix基礎知識

互斥量(也稱為互斥鎖)出自POSIX線程標准,可以用來同步同一進程中的各個線程。當然如果一個互斥量存放在多個進程共享的某個內存區中,那麼還可以通過互斥量來進行進程間的同步。

互斥量,從字面上就可以知道是相互排斥的意思,它是最基本的同步工具,用於保護臨界區(共享資源),以保證在任何時刻只有一個線程能夠訪問共享的資源。

互斥量類型聲明為pthread_mutex_t數據類型,在<bits/pthreadtypes.h>中有具體的定義。

1互斥量初始化和銷毀

#include <pthread.h>  
int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);  
      
int pthread_mutex_destroy (pthread_mutex_t *mutex);  
                                              返回值:若成功則返回0,否則返回錯誤編號

上面兩個函數分別由於互斥量的初始化和銷毀。

如果互斥量是靜態分配的,可以通過常量進行初始化,如下:

pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;

也可以通過調用pthread_mutex_init函數初始化。如果動態分配互斥量(例如通過調用malloc函數),那麼在釋放內存前需要調用pthread_mutex_destroy。

要用默認的屬性初始化互斥量,只需要把attr設置為NULL。

當不在需要使用互斥量時,需要調用pthread_mutex_destroy()銷毀互斥量所占用的資源。

2 互斥量的使用

#include <pthread.h>  
int pthread_mutex_trylock (pthread_mutex_t *mutex);  
      
int pthread_mutex_lock (pthread_mutex_t *mutex);  
      
int pthread_mutex_unlock (pthread_mutex_t *mutex);  
                                        返回值:若成功則返回0,否則返回錯誤編號

對互斥量進行加鎖,需要調用pthread_mutex_lock,如果互斥量已經上鎖,調用線程將阻塞直到互斥量被解鎖。對互斥量解鎖需要調用pthread_mutex_unlock。

如果線程不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對互斥量進行加鎖。如果調用pthread_mutex_tyrlock時互斥量處於未加鎖狀態,那麼pthread_mutex_trylock將鎖住互斥量,不會出現阻塞並返回0,否則pthread_muxte_trylock就會失敗,不能鎖住互斥量,而返回EBUSY。

這裡要強調的是:互斥量是用於上鎖的,不能用於等待。

簡單說就是,互斥量的使用流程應該是:線程占用互斥量,然後訪問共享資源,最後釋放互斥量。而不應該是:線程占用互斥量,然後判斷資源是否可用,如果不可用,釋放互斥量,然後重復上述過程。這種行為稱為輪轉或輪詢,是一種浪費CPU時間的行為。

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/

Copyright © Linux教程網 All Rights Reserved