執行緒間同步機制 互斥鎖

2021-06-27 19:50:49 字數 3397 閱讀 8101

互斥以排他方式防止共享資料被併發修改。互斥量從本質來說是一把鎖,是乙個二元變數,其狀態為開鎖(允許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 狀態,也可以處於解鎖 ...