天天看點

Linux多線程實踐(6) --Posix讀寫鎖解決讀者寫者問題

讀寫鎖與互斥量類似, 不過讀寫鎖允許更高的并行性. 讀寫鎖用于讀稱為共享鎖, 讀寫鎖用于寫稱為排它鎖;

讀寫鎖規則:

  隻要沒有線程持有給定的讀寫鎖用于寫, 那麼任意數目的線程可以持有讀寫鎖用于讀;

  僅當沒有線程持有某個給定的讀寫鎖用于讀或用于寫時, 才能配置設定讀寫鎖用于寫;

  自旋鎖類似于互斥鎖, 它的性能比互斥鎖更高;

  自旋鎖與互斥鎖很重要的一個差別在于: 線程在申請自旋鎖的時候, 線程并不會挂起, 它總是處于忙等待的狀态(一直在自旋, CPU處于空耗的狀态);

  自旋鎖可用于以下情況:鎖被持有的時間短, 而且線程并不希望在重新排程上花費太多的成本.

  自旋鎖通常作為底層原語用于實作其他類型的鎖: 比如有些互斥鎖的實作在試圖擷取互斥量的時候會自旋一小段時間, 隻有在自旋計數到達某一門檻值的時候才會休眠; 是以, 很多互斥量的實作非常搞笑, 以至于應用程式采用互斥鎖的性能與曾經采用過自旋鎖的性能基本上是相同的.

  是以, 自旋鎖隻在某些特定的情況下有用, 比如在使用者層, 自旋鎖并不是非常有用, 除非運作在不允許搶占的實時排程類中.

問題描述

  一個資料對象可以為多個并發程序所共享。其中有的程序可能隻需要讀共享對象的内容,而其他程序可能要更新共享對象的内容。

    讀者:隻對讀感興趣的程序;

    寫者:其他程序(隻寫,或既讀又寫);

  規則

    允許多個讀者同時讀取資料;

    隻有一個寫者可以寫資料;

    寫者在寫時讀者不能讀,反之亦然。

  “讀者優先”思想小結: 讀者優先的設計思想是讀程序隻要看到有其它讀程序正在讀,就可以繼續進行讀;寫程序必須等待所有讀程序都不讀時才能寫,即使寫程序可能比一些讀程序更早提出申請。該算法隻要還有一個讀者在活動,就允許後續的讀者進來,該政策的結果是,如果有一個穩定的讀者流存在,那麼這些讀者将在到達後被允許進入。而寫者就始終被挂起,直到沒有讀者為止.

繼續閱讀