資源描述:
《Linux多線程編程——線程同步.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、Linux多線程編程——線程同步lym發(fā)布于2008-4-30
2、704次閱讀??字號(hào):大?中?小??(網(wǎng)友評(píng)論?8?條)?我要評(píng)論04-30Linux多線程同步——mutex[折疊]1.初始化:在Linux下,線程的互斥量數(shù)據(jù)類(lèi)型是pthread_mutex_t.在使用前,要對(duì)它進(jìn)行初始化:對(duì)于靜態(tài)分配的互斥量,可以把它設(shè)置為PTHREAD_MUTEX_INITIALIZER,或者調(diào)用pthread_mutex_init.對(duì)于動(dòng)態(tài)分配的互斥量,在申請(qǐng)內(nèi)存(malloc)之后,通過(guò)pthread_mutex
3、_init進(jìn)行初始化,并且在釋放內(nèi)存(free)前需要調(diào)用pthread_mutex_destroy.原型:intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexattr_t*restricattr);intpthread_mutex_destroy(pthread_mutex_t*mutex);頭文件:返回值:成功則返回0,出錯(cuò)則返回錯(cuò)誤編號(hào).說(shuō)明:如果使用默認(rèn)的屬性初始化互斥量,只需把a(bǔ)ttr設(shè)為NULL.其他值在以
4、后講解.2.互斥操作:對(duì)共享資源的訪問(wèn),要對(duì)互斥量進(jìn)行加鎖,如果互斥量已經(jīng)上了鎖,調(diào)用線程會(huì)阻塞,直到互斥量被解鎖.在完成了對(duì)共享資源的訪問(wèn)后,要對(duì)互斥量進(jìn)行解鎖.首先說(shuō)一下加鎖函數(shù):頭文件:原型:intpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthread_mutex_t*mutex);返回值:成功則返回0,出錯(cuò)則返回錯(cuò)誤編號(hào).說(shuō)明:具體說(shuō)一下trylock函數(shù),這個(gè)函數(shù)是非阻塞調(diào)用模式,也就是說(shuō),如果互斥量沒(méi)
5、被鎖住,trylock函數(shù)將把互斥量加鎖,并獲得對(duì)共享資源的訪問(wèn)權(quán)限;如果互斥量被鎖住了,trylock函數(shù)將不會(huì)阻塞等待而直接返回EBUSY,表示共享資源處于忙狀態(tài).再說(shuō)一下解所函數(shù):頭文件:原型:intpthread_mutex_unlock(pthread_mutex_t*mutex);返回值:成功則返回0,出錯(cuò)則返回錯(cuò)誤編號(hào).3.死鎖:死鎖主要發(fā)生在有多個(gè)依賴(lài)鎖存在時(shí),會(huì)在一個(gè)線程試圖以與另一個(gè)線程相反順序鎖住互斥量時(shí)發(fā)生.如何避免死鎖是使用互斥量應(yīng)該格外注意的東西.總體來(lái)講,有幾個(gè)不成文的基本原
6、則:對(duì)共享資源操作前一定要獲得鎖.完成操作以后一定要釋放鎖.盡量短時(shí)間地占用鎖.如果有多鎖,如獲得順序是ABC連環(huán)扣,釋放順序也應(yīng)該是ABC.線程錯(cuò)誤返回時(shí)應(yīng)該釋放它所獲得的鎖.談了這么多就讓我舉個(gè)實(shí)際點(diǎn)的例子來(lái)說(shuō)明以上函數(shù)的功能:(代碼來(lái)源于:《GPRS服務(wù)器Linux編程》作者:李楊明)#include#include#include#include#includepthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;intlock_var;time_tend_
7、time;intsum;voidpthread1(void*arg);voidpthread2(void*arg);voidpthread3(void*arg);intmain(intargc,char*argv[]){pthread_tid1,id2,id3;pthread_tmon_th_id;intret;sum=10;end_time=time(NULL)+10;pthread_mutex_init(&mutex,NULL);ret=pthread_create(&id1,NULL,(void*)
8、pthread1,NULL);if(ret!=0)perror("pthreadcread1");ret=pthread_create(&id2,NULL,(void*)pthread2,NULL);if(ret!=0)perror("pthreadcread2");ret=pthread_create(&id3,NULL,(void*)pthread3,NULL);if(ret!=0)perror("pthreadcread3");pthread_join(id1,NULL);pthread_join(
9、id2,NULL);pthread_join(id3,NULL);exit(0);}voidpthread1(void*arg){inti;while(time(NULL)