星期五, 5月 22, 2009

有人說,酒後容易吐真言,是因為腦子不理智了..
我卻說,是因為心軟了..

曾經,就像夢一般,見到、聽到、體會到,卻摸不著、動不了..
所有的一切,只能看著它發生,一點一滴成為過去,無能為力改變什麼

夢不是劇本,是演出。
劇本每次看,所有缺陷都能立即更改。
夢同樣能一看再看,可是第一次演出後,就成為無可抹滅的歷史!!
可以造假,卻消除不了心裡的真象。

一生中,有多少機率做同樣的夢呢?
這個夢很甜很甜,可是那終究還是夢。
兩次,真該滿足了!!

我不會再徬徨,也不會再眷念
這樣停下自己的腳步不值得

這一切一點也不心酸
對我來說,它仍是個甜美的存在
一個絕對忘不了的夢!!

星期二, 5月 19, 2009

神奇的鎖 - mutex

寫 C 的 pthread 時,經常會碰到一個問題:「如果有兩個以上的 thread 同時存取同一變數,該怎麼辦?」。有個很消極的作法是...不管它。

這樣的作法優點是,省事。可是一旦碰上問題,整個系統將因此錯亂。底下我將介紹一種在 multi threading 系統中,很常被使用的作法 - lock


在 pthread.h 中,提供了 pthread_mutex_t 變數型態及其相關 function 。為了解釋上的方便,這裡我把 pthread_mutex_t 看成是一個鎖。

這個鎖的用途是,當你想存取某些資源時,必須先取得這個鎖,然後進行資料處理,最後把鎖放回去。只要你沒拿到這個鎖,就必須不斷地等拿走這個鎖的人將它放回。整個流程如下:



所以,當一個 thread 存取某個(或某些)變數時,必須先呼叫 pthread_mutex_lock 取得該變數(或該群變數)的鎖,才能進行接下來的處理;而處理完之後,也必須呼叫 pthread_mutex_unlock 將鎖放回原位,讓其他需要這個鎖的 thread 也能順利完成工作。

至於一個 multi threading 的系統有幾個鎖,每個鎖分別管理哪些變數(資源),全都由 programmer 自行決定。鎖分得越多,雖然系統的效能會增加,但同時也該更加重視 deadlock 的問題。反之,若一個鎖管理全部的資源,則絕對不會有 deadlock 的問題,但缺點是會降低系統的效能(因為 thread 進行資料處理時,經常只用到一小部分的 global 變數,而一個鎖綁住全部資源就代表,不管 thread 需要存取多少 global 變數,都將拒絕其他 thread 存取它用不到的的變數,直到該 thread 把事情做完為止。)

有時候理論說了一大堆,還是不如實作來得有趣。
也只有下場實作時,才能體會理論的精隨