"小濤,還有多少啊,你看我本來就開玩笑似的說說火車票,飛機票的事,看MM的事,你在眉飛色舞,雞飛狗跳的沒完了呢…”
"啊?怎麼這樣呢,本來一個寢室,做人的差別就那麼大囁,平時不好好學習,有問題了問我,給你免費教學,還滿腹牢騷,也太不夠朋友了吧…."我錘著桌子說.
"朋友,我還不夠朋友啊,你沒聽說嗎:朋友為我,兩肋插刀,我為朋友,插它兩刀..“小王打斷我,”聽你念經似的,都三個小時了,你瞧,都來五了,怎麼,你還想和老易的品三國pk一下誰的集..“
想想我也無語了,太陽起了又落,落了又起;花兒也不知開了幾次,都懶得理我了,我也尋思這個並發控製為啥就講不完呢..後面還有精彩的沒說呢,不能在這裡就把小王的勁頭給扼殺了…”好了,你也別唧唧歪歪,嘟嘟倫倫了,我發誓,對燈發誓,如果這節還講不完,你GF的事,我給你解決了,還不行嗎”我是無奈了。
“這感情好..”一聽到MM的話題,小王總是有說不完的激情,沒辦法,做人的差距還就是那麼大.
言歸正傳,話說...
出招表十:讀寫訊號量(不是吧,都十了,怪不得小王不耐煩了,這麼多招式,相當你,我有九陽神功護體還沒這麼快呢..哎)
“小王,你記得不,我在前邊提到過一招,說的是:防讀不防寫…“
"記得,有MM,我就記得,沒有那就好說了..“
“得得,不問你了,三句不離XXX”
傳說中:讀寫訊號量可允許N個讀執行單元同時訪問共用資源,而最多隻能有一個寫執行單元。
“我想起來了,想起來了,就是和前邊的那個什麼----防出不防進…..差不多…”想想小王那副口水哈子吊多長的樣子,我都懶的理他了..
使用方法:1)定義和初始化讀寫訊號量
struct rw_semphore my_rws; //定義讀寫訊號量
void init_rwsem(struct rw_semaphore *sem); //初始化讀寫訊號量
2)讀訊號量擷取
void down_read(struct rw_semaphore *sem);
int down_read_try(struct rw_semaphore *sem);
3)讀訊號量釋放
void up_read(struct rw_semaphore *sem);
4)寫訊號量擷取
void down_write(struct rw_semaphore *sem);
int down_write_try(struct rw_semaphore *sem);
5)寫訊號量釋放
void up_write(struct rw_semaphore *sem);
給個例子吧:
rw_semaphore rw_sem;//定義讀寫訊號量init_rwsem(&rw_sem);//初始化讀寫訊號量//讀時擷取訊號量down_read(&rw_sem);...//臨界資源up_read(&rw_sem);//寫時擷取訊號量down_write(&rw_sem);...//臨界資源up_write(&rw_sem);
說句真的,如果小王賴上我給他找個MM,我還心裡真沒底,所以嗎,下面說最最最最後一招,我也就解放了哦…
出招表十一:互斥體(啥叫互斥體,怎麼感覺前邊的都是互斥體,呵呵,確實,只不過Linux開發人員們覺得不過癮,就專門研究了一個互斥體,誰讓咱用人家的東西呢)
使用方法:1)定義並初始化互斥體
struct mutex my_mutex;
mutex_init(&my_mutex);
2)擷取互斥體
void fastcall mutex_lock(struct mutex *lock);//引起的睡眠不能被打斷
int fastcall mutex_lock_interruptible(struct mutex *lock);//可以被打斷
int fastcall mutex_lock_trylock(struct mutex *lock);//嘗試獲得,擷取不到也不會導致進程休眠
3)釋放互斥體
void fastcall mutex_unlock(struct mutex *lock);
給個例子:
struct mutex my_mutex; //定義mutex
mutex_init(&my_mutex);
mutex_lock(&my_mutex);
….//臨界資源
mutex_unlock(&my_mutex);
完了,一切都完了,有關並發控制的相關招數都完了,小王也該放心去追MM了,有我這幾招,看誰還敢競爭,我也不用愁了,總算在這一集講完了本不該講完的東西..
如果有需要,我會給大家講一節有關載入了並發控制的字元裝置驅動程式,名字我都想好了---需要的請舉手,火熱招標中哈..
不好意思,人在江湖走,怎能不濕腳,不小心做起廣告來了…