互斥以排他方式防止共享資料被併發修改。互斥量從本質來說是一把鎖,是乙個二元變數,其狀態為開鎖(允許0)和上鎖(禁止1),在訪問共享資源前對互斥量進行設定(加鎖),在訪問完成後釋放(解鎖)互斥量。
(1)在訪問該資源前,首先申請該互斥鎖,如果該互斥鎖處於開鎖狀態,則申請到該鎖物件,並立即占有該鎖(使該鎖處於鎖定狀態),以防止其他執行緒訪問該資源;如果該互斥量處於鎖定狀態,預設阻塞等待
(2)只有鎖定該互斥鎖的程序才能釋放該互斥鎖。其他執行緒的釋放操作無效。
在使用互斥鎖之前,需要定義該互斥鎖(全域性變數)。
pthread_mutex_t lock;
#include int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destory(pthread_mutex_t *mutex);
//兩個函式的返回值:若成功,返回0;否則,返回錯誤編號
初始化:
第乙個引數mutex是指向要初始化的互斥鎖的指標。
第二個引數mutexattr是指向屬性物件的指標,該屬性物件定義要初始化的互斥鎖的屬性。如果該指標為null,則使用預設屬性。
此外,還可以使用巨集pthread_mutex_initializer初始化靜態分配的互斥鎖。
#define pthread_mutex_initializer }
對於靜態初始化的互斥鎖,不需要呼叫pthread_mutex_init()函式。
pthread_mutex_t_mp = pthread_mutex_initializer;
如果乙個執行緒要占有一共享資源,其必須先給互斥鎖上鎖。pthread_mutex_lock()函式以阻塞方式申請互斥鎖。
#include int pthread_mutex_lock(pthread_mutex_t *mutex); //若成功,返回0;否則,返回錯誤編號
pthread_mutex_trylock()函式以非阻塞方式申請互斥鎖。
#include int pthread_mutex_trylock(pthread_mutex_t *mutex);//若成功,返回0;否則,返回錯誤編號
如果執行緒不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對互斥量進行加鎖。如果呼叫pthread_mutex_trylock時互斥量處於未鎖住的狀態,那麼pthread_mutex_trylock將鎖住互斥量,不會出現阻塞直接返回0,如果mutex引數所指定的互斥鎖已經被鎖定的話,呼叫pthread_mutex_trylock函式不會阻塞當前執行緒,而是立即返回乙個值來描述互斥鎖的狀況ebusy。
#include int pthread_mutex_unlock(pthread_mutex_t *mutex); //若成功,返回0;否則,返回錯誤編號
引數mutex為指向要解鎖的互斥鎖的指標。釋放操作只能由占有該互斥鎖的執行緒完成。
下面是乙個使用互斥鎖的應用例項,在此程式中,共用兩個執行緒: 乙個執行緒負責從標準輸入裝置中讀取資料儲存在全域性資料區,另乙個執行緒負責將讀入的資料輸出到標準輸出裝置。
(1)處理輸入操作的執行緒在接收使用者輸入資訊時不能被中斷,因此需要先使用互斥鎖獲得資源占用,阻塞其他執行緒的執行。
(2)輸出執行緒中為了保證輸出不被中斷,同樣在輸出資訊前後需要先鎖定互斥鎖,操作完成後釋放互斥鎖。
#include #include #include #include #include #define work_size 1024
void *thread_function(void *arg);
pthread_mutex_t work_mutex; //全域性互斥鎖物件
char work_area[work_size]; //全域性共享資料區
int time_to_exit = 0;
int main(int argc, char *argv)
res = pthread_create(&a_thread, null, (void *)thread_function, null); //建立新執行緒
if (res != 0)
pthread_mutex_lock(&work_mutex); //接收輸入前,給互斥鎖上鎖
printf("input some text. enter 'end' to finish\n");
while(!time_to_exit) //time_to_exit值由另一線程修改
else //如果已經輸出,執行下一輪讀入
break;
} }pthread_mutex_unlock(&work_mutex); //解鎖
printf("\nwaiting for thread to finish...\n");
res = pthread_join(a_thread, &thread_result); //等待另乙個執行緒結束
if (res != 0)
printf("thread joined\n");
pthread_mutex_destroy(&work_mutex); //銷毀互斥鎖
exit(exit_failure);
}void *thread_function(void *arg) //子執行緒執行的程式
} time_to_exit = 1; //置結束標識位,通知主線程操作結束
work_area[0] = '\0';
pthread_mutex_unlock(&work_mutex); //解鎖
pthread_exit(0); //退出
}
undefined reference to 'pthread_create'
undefined reference to 'pthread_join'
問題原因:
pthread 庫不是 linux 系統預設的庫,連線時需要使用靜態庫 libpthread.a,所以在使用pthread_create()建立執行緒,以及呼叫 pthread_atfork()函式建立fork處理程式時,需要鏈結該庫。
問題解決:
在編譯中要加 -lpthread引數
gcc mutex_example mutex_example.c -lpthread
mutex_example.c為你些的原始檔,不要忘了加上標頭檔案#include
同步機制 互斥鎖
互斥鎖指代相互排斥,它是最基本的同步形式。互斥鎖用於保護臨界區,以保證任何時刻只有乙個執行緒在執行其中的 或者任何乙個時刻只有乙個程序在執行其中的 保護乙個臨界區的 的通常輪廓大體如下 lock the mutex 臨界區unlock the mutex posix互斥鎖被宣告為具有pthread ...
程序 執行緒間同步機制。
一 程序 執行緒間同步機制。臨界區 互斥區 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源...
執行緒管理 互斥量同步機制
互斥量機制 在計算機系統中有許多共享資源不允許使用者並行使用,像印表機這樣的共享裝置被稱為 排它性資源 因為它一次只能由乙個執行流訪問。執行流必須以互斥的方式 執行訪問排它性資源的 互斥量 mutex 又稱為互斥鎖,是一種用來保護臨界區的特殊變數,它可以處於鎖定 locked 狀態,也可以處於解鎖 ...