自旋鎖最多只能被乙個可執行執行緒持有,如果乙個執行執行緒試圖獲得乙個已經被持有的自旋鎖,那麼該執行緒就會一直進行迴圈—旋轉—等待鎖重新可用。乙個被爭用的自旋鎖使得請求它的執行緒在等待鎖重新可用時自旋,這樣就特別浪費處理器時間,所以自旋鎖不應該被長時間持有,相比於互斥鎖,互斥鎖會讓執行緒阻塞,被阻塞的執行緒需要換入換出,這樣進行上下文切換也會帶來一定的開銷,因此互斥鎖一般適用於持鎖時間更長的情況。而自旋鎖的持有時間應該盡可能短,最好短於兩次執行緒上下文切換的時間。
讀共享,寫獨佔,寫優先。
如果有寫鎖請求在等待,則新的讀鎖請求也應該等待,否則程式可能永遠也沒有機會獲得寫鎖
一旦寫鎖被釋放,所有在等待的讀鎖和寫鎖請求應該公平競爭,而不管請求的先後,只要之前已經在等待就應該有獲得鎖的機會。
linux中訊號量是一種睡眠鎖。如果有乙個任務試圖獲得乙個不可用(已經被占用)的訊號量時,訊號量會將其推進乙個等待佇列,然後讓其睡眠,這時處理器就能去執行其它**,當持有的訊號量可用(被釋放)後,處於等待佇列中的那個任務將被喚醒,並獲得該訊號量。
由於爭用訊號量的程序在等待鎖重新變為可用時會睡眠,還要維護等待佇列以及喚醒程序,因此開銷較大,適用於鎖會被長時間持有的情況。訊號量的乙個有用特性是它可以同時允許任意數量的鎖持有者。訊號量同時允許的持有者數量可以在宣告訊號量的時候指定,當持有者數量指定為1的時候,同一時刻只能有乙個任務持有,這時可稱它為互斥訊號量。當持有者數量指定值大於1時稱作計數訊號量。訊號量通過原子操作down(),up()來增減。
互斥鎖和互斥訊號量很相似,但是它更簡潔更高效,因此一般情況下優先使用互斥鎖。
Linux核心同步方法
1 原子操作,是其它同步方法的基礎。2 自旋鎖,執行緒試圖獲取乙個已經被別人持有的自旋鎖,當前執行緒處於忙等待,占用cpu資源。3 讀寫自旋鎖,根據通用性和針對性的特點,普通自旋鎖在特定場景下的表現會退化。因此,提供了讀寫自旋鎖,讀鎖可以加讀鎖,不能加寫鎖,寫鎖不能加任何鎖。4 需要注意的幾項 普通...
Linux中的同步互斥
生活中的例子 洗菜必須在買菜之後,做菜必須在洗菜之後,吃飯必須在做菜之後.軟體上的概念 指的是散落在不同執行緒 程序中的 片段,他們的執行順序必須是有序,因為b 片段的執行依賴著a 片段的結果,同理c 片段的執行依賴著b 片段的結果.那麼,怎麼實現abc的有序執行呢?這就是同步的任務.同步用於保證這...
linux程序間的同步方法
程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是用於兩個程序之間的通訊,首先...