UNIX網絡編程卷二 筆記 互斥鎖和條件變量

第3章 互斥鎖和條件變量

3.1 概述

默認情況下互斥鎖和條件變量用於線程間同步,若將它們放在共享內存區,也能用於進程間同步。

對一個公共對象的訪問若不能原子進行,就需要某種形式的同步。

3.2 互斥鎖

靜態分配的互斥鎖變量可以用常值PTHREAD_MUTEX_INITIALIZER初始化,動態分配和用於共享內存的互斥鎖變量要用pthread_mutex_init初始化。

pthread_mutex_lock:阻塞模式上鎖。

pthread_mutex_trylock:非阻塞模式上鎖。

pthread_mutex_unlock:解鎖,只能由上鎖的線程執行。

互斥鎖是協作性鎖,無法禁止繞過這種機制的訪問。

3.3 生產者-消費者

也稱有界緩衝區問題,若干個生產者和若干個消費者共享使用固定數目的緩衝區,因而帶來的同步和通信問題。

各種IPC手段本身就是一個生產者-消費者問題的實例。

管道、FIFO和消息隊列的同步是隱式同步,使用者只能通過指定的接口來使用這些IPC方式,其中的同步都由內核完成。

共享內存作爲IPC,需要使用者進行顯式同步,線程間共享全局數據也需要顯式同步。

3.4 條件變量

互斥鎖只能用於上鎖,實現對某個共享對象的互斥訪問,無法用於對某事件的等待。條件變量則用於等待。靜態分配的條件變量可以用常值PTHREAD_COND_INITIALIZER初始化。


    int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);

每個條件變量都需要關聯一個互斥鎖,用來提供對等待條件的互斥訪問。調用pthread_cond_waitmptr需要是上鎖狀態,Posix保證pthread_cond_wait返回後mptr仍是上鎖狀態,但調用期間會自動將mptr解鎖。pthread_cond_wait返回時要先測試等待條件,避免假喚醒。

pthread_cond_signal:喚醒某個等待中的線程。

pthread_cond_broadcast:喚醒等待的所有線程,例子是讀寫鎖中等待寫完成的所有讀者。

pthread_cond_timedwait:帶超時的等待,超時時間是絕對時間。返回超時錯誤後,仍要先測試等待條件。

3.5 互斥鎖和條件變量的屬性

互斥鎖和條件變量可設置的屬性只有進程間共享屬性,值可爲:PTHREAD_PROCESS_PRIVATEPTHREAD_PROCESS_SHARED

對互斥鎖、條件變量使用init函數初始化的話,使用完後要用destroy函數摧毀,對它們的屬性對象也有相同的要求。

3.6 互斥鎖的非正常終止

若進程在持有互斥鎖時終止,內核不會負責自動釋放持有的鎖。內核自動清理的唯一同步鎖類型是fcntl記錄鎖。

若被鎖住的互斥鎖的持有進程或線程終止,會造成這個互斥鎖無法解鎖,因而死鎖。線程可以安裝線程清理程序,用來在被取消時能釋放持有的鎖。但這種釋放可能會導致共享對象的狀態被部分更新,造成不一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章