星期二, 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 把事情做完為止。)

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

沒有留言: