|
為保證每個(gè)線程對(duì)同一資源訪問(wèn)有效,比如一個(gè)線程想要從共享資源讀數(shù)據(jù),而這些資源正在被其他線程修改,那么讀出來(lái)的數(shù)據(jù)是無(wú)效的,那么就要想辦法讓其他線程修改完再去讀,這時(shí)候就用到了同步機(jī)制。可以使用Linux系統(tǒng)提供的機(jī)制來(lái)對(duì)線程訪問(wèn)資源的順序進(jìn)行同步,本文檔挑選了信號(hào)量,互斥鎖,條件變量來(lái)介紹線程同步機(jī)制,實(shí)驗(yàn)代碼在sync/目錄下。 1 POSIX無(wú)名信號(hào)量 本章介紹POSIX 無(wú)名信號(hào)量,以下簡(jiǎn)稱信號(hào)量。信號(hào)量類似于計(jì)數(shù)器,操作方法和前面的System V 信號(hào)燈基本一樣。 使用信號(hào)量的步驟: 1.在程序全局區(qū)定義信號(hào)量; 2.使用seminit()初始化信號(hào)量; 3.使用sem_wait()和sem_post()對(duì)信號(hào)量進(jìn)行P/V操作; 4.使用sem_destroy()銷毀信號(hào)量。 信號(hào)量常用函數(shù)如下: sem_init():對(duì)信號(hào)量值進(jìn)行初始化, #include int sem_init(sem_t *sem, int pshared, unsigned int value); 參數(shù)含義: sem:指針,指向定義的信號(hào)量; pshared:指明這個(gè)信號(hào)量用于進(jìn)程還是線程,0為線程,不等于0為進(jìn)程,本節(jié)填寫為0。 value:信號(hào)量初始值 返回值:成功返回0,錯(cuò)誤返回-1。 sem_wait():等待一個(gè)信號(hào)量,進(jìn)行P操作,信號(hào)量值-1; sem_post():?jiǎn)拘岩粋(gè)信號(hào)量,進(jìn)行V操作,信號(hào)量值+1,定義如下: #include int sem_wait(sem_t *sem); int sem_post(sem_t *sem); 參數(shù)含義: sem:要操作的信號(hào)量; 返回值:成功返回0,錯(cuò)誤返回-1。 sem_destroy():銷毀初始化后的信號(hào)量 #include int sem_destroy(sem_t *sem); sem:要操作的信號(hào)量; 返回值:成功返回0,錯(cuò)誤返回-1。 實(shí)驗(yàn)代碼在sync/sem.c:路徑為:11_Linux系統(tǒng)開發(fā)進(jìn)階\Linux系統(tǒng)編程_章節(jié)使用資料。 使用信號(hào)量控制讀寫線程,初始化時(shí)寫信號(hào)量為1,讀信號(hào)量為0,那么讀線程就會(huì)阻塞,寫線程就會(huì)執(zhí)行并將寫信號(hào)-1,寫線程在fgets等待輸入,當(dāng)輸入完成后,將讀信號(hào)+1喚醒讀線程,這樣讀寫線程交替執(zhí)行就完成了同步。
|