|   線程解析(三)  時間:2016-12-30作者:華清遠見 前面我們說(shuo)了線程的(de)創建(jian)和撤(che)銷(xiao),這里我們說(shuo)一下線程間(jian)的(de)同步的(de)問題。 當同一個(ge)(ge)進程(cheng)(cheng)(cheng)中存(cun)在多個(ge)(ge)線程(cheng)(cheng)(cheng)的(de)(de)(de)時(shi)候,多個(ge)(ge)線程(cheng)(cheng)(cheng)共享(xiang)相(xiang)同的(de)(de)(de)內(nei)存(cun),確保(bao)每(mei)個(ge)(ge)線程(cheng)(cheng)(cheng)能夠看到一致的(de)(de)(de)數據(ju)視圖,如果每(mei)個(ge)(ge)線程(cheng)(cheng)(cheng)中都(dou)不(bu)(bu)(bu)會讀(du)取(qu)或(huo)修(xiu)改(gai)共同享(xiang)有的(de)(de)(de)變量,就不(bu)(bu)(bu)會存(cun)在一致性的(de)(de)(de)問(wen)題(ti),同樣如果共享(xiang)變量時(shi)只讀(du)的(de)(de)(de)也就不(bu)(bu)(bu)會存(cun)在這(zhe)個(ge)(ge)問(wen)題(ti)。但是,當某個(ge)(ge)線程(cheng)(cheng)(cheng)可(ke)一個(ge)(ge)修(xiu)改(gai)變量,而其他的(de)(de)(de)線程(cheng)(cheng)(cheng)去讀(du)取(qu)或(huo)修(xiu)改(gai)這(zhe)個(ge)(ge)變量的(de)(de)(de)時(shi)候,就需要(yao)進行(xing)線程(cheng)(cheng)(cheng)間的(de)(de)(de)同步(bu),確保(bao)他們訪(fang)問(wen)變量的(de)(de)(de)內(nei)容時(shi)不(bu)(bu)(bu)會訪(fang)問(wen)到無效(xiao)的(de)(de)(de)數據(ju)。 這里介紹一種實現同步(bu)的方法:互斥(chi)量(liang) 互斥(chi)鎖本質上是一(yi)把鎖,在訪(fang)問(wen)共享資源的時(shi)候(hou)對互斥(chi)量進行加鎖,訪(fang)問(wen)結(jie)束后解鎖。在這里我們(men)說一(yi)下(xia)如何去操作互斥(chi)鎖。 1、 創(chuang)建和撤銷(xiao) 
	互斥量用pthread_mutex_t數據類型來表示,在使用之前必須對其進行初始化,用完之后釋放內存。互斥量初始化可以用PTHREAD_MUTEX_INITIALIZER來初始化(靜態初始化),亦可以使用pthread_mutex_init函數來實現,這種方法動態的為互斥量分配內存,使用后必須使用pthread_mutex_destroy來釋放內存單元。下面是這些函數的原型: 2、 鎖操作 
	鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試鎖pthread_mutex_trylock()三個。通過pthread_mutex_lock對互斥量加鎖,這里需要獲得鎖,如果無法獲得鎖則調用線程將阻塞到其他線程調用pthread_mutex_unlock對互斥量解鎖。 如果線程(cheng)不希望(wang)被阻塞(sai),則可以調用pthread_mutex_trylock嘗試對互(hu)斥(chi)量(liang)進行加鎖(suo),當互(hu)斥(chi)量(liang)沒有被加鎖(suo),則函數返回0,并鎖(suo)住互(hu)斥(chi)量(liang),否則會失敗,返回EBUSY. 3、 示例 下面我們用一個例(li)程說(shuo)明一下這些函數(shu)的使(shi)用。 
	#include <stdio.h> pthread_mutex_t mutex; 
	void *thread_a(void *arg) 
	void *thread_b(void *arg) 
	int main(int argc, char **argv) 
	        if(pthread_mutex_init(&mutex, NULL) != 0) 
	        err = pthread_create(&tid_a,NULL,thread_a,NULL); 
	        sleep(20); 
	結果: 由這里(li)的(de)結(jie)果可以看出mutex的(de)用處及幾個相關函數的(de)使用方(fang)法(fa)。 發表評論 
 |