在前面的文章中提及到,乙個程序中的多個執行緒是共享同一段資源的,由於執行緒對資源的競爭引出了鎖。其中mutex是一種簡單的加鎖方法,這個互斥鎖只有兩種狀態,那就是上鎖和解鎖,可以把互斥鎖看作是某種意義上的全域性變數。在某一時刻,只能有乙個執行緒取得這個互斥上的鎖,擁有上鎖狀態的執行緒可以對共享資源進行操作,而其他執行緒在該執行緒未解鎖之前,夠會被掛起,直到上鎖的執行緒解開鎖。可以這麼說,互斥鎖使得共享資源按序的在各個執行緒上操作。
互斥鎖的操作主要包括互斥鎖初始化、上鎖、判斷上鎖、解鎖、摧毀互斥鎖。其中互斥鎖可以分為快速互斥鎖、遞迴互斥鎖這檢錯互斥鎖。這三種鎖的區別主要在於其他未占有互斥鎖的執行緒在希望得到互斥鎖時是否需要等待掛起。快速鎖是指呼叫執行緒會阻塞直到執行緒鎖得到解鎖為止。遞迴鎖能夠成功地返回並且增加呼叫執行緒在互斥上的加鎖次數,比如乙個鍊錶在進行插入的操作時,可以進行查詢的操作。檢錯鎖則為快速互斥鎖的非阻塞版本,它會立即返回並返回乙個錯誤的資訊。
1、函式簡義。
(1)pthread_mutex_init
標頭檔案:
函式原型: int pthread_mutex_init (pthread_mutex_t* mutex,
const pthread_mutexattr_t* mutexattr);
函式傳入值: mutex:互斥鎖。
mutexattr:pthread_mutex_initializer:建立快速互斥鎖。
pthread_recursive_mutex_initializer_np:建立遞迴互斥鎖。
pthread_errorcheck_mutex_initializer_np:建立檢錯互斥鎖。
函式返回值: 成功:0
出錯:-1
(2)上鎖函式:
int pthread_mutex_lock(pthread_mutex_t* mutex);
int pthread_mutex_trylock (pthread_mutex_t* mutex);
int pthread_mutex_unlock (pthread_mutex_t* mutex);
int pthread_mutex_destroy (pthread_mutex_t* mutex);
函式傳入值: mutex:互斥鎖。
函式返回值: 同上。
2、互斥鎖實現。
[cpp] view plain
copy
include
#include
#include
#include
#include
#define return_if_fail(p) /
if((p) == 0)
typedef
struct
_privinfo
privinfo;
static
void
info_init (privinfo* thiz);
static
void
* pthread_func_1 (privinfo* thiz);
static
void
* pthread_func_2 (privinfo* thiz);
intmain (
intargc,
char
** argv)
info_init(thiz);
ret = pthread_create (&pt_1, null, (void
*)pthread_func_1, thiz);
if(ret != 0)
ret = pthread_create (&pt_2, null, (void
*)pthread_func_2, thiz);
pthread_join (pt_1, null);
pthread_join (pt_2, null);
pthread_mutex_destroy (&thiz->mutex);
free (thiz);
thiz = null;
return
0;
}
static
void
info_init (privinfo* thiz)
static
void
* pthread_func_1 (privinfo* thiz)
else
for(i = 0; i < 2; i++)
ret = pthread_mutex_unlock (&thiz->mutex);
if(ret != 0)
else
}
return
;
}
static
void
* pthread_func_2 (privinfo* thiz)
else
else
ret = pthread_mutex_unlock (&thiz->mutex);
if(ret != 0)
sleep (3);
}
}
}
執行緒 互斥鎖
include include include include include 1.靜態初始化,當動態初始化時,遮蔽靜態初始化 pthread mutex t mutex pthread mutex initializer 2.動態初始化 pthread mutex t mutex int lock...
執行緒互斥鎖
執行緒互斥鎖 降低效率,保證資料安全 執行緒 資料共享 修改共享資料,資料不安全 from threading import thread,lock import time n 100 deftask global n temp n time.sleep 0.1 n temp 1 if name m...
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...