執行緒同步 多執行緒自旋鎖

2021-08-09 11:31:46 字數 1049 閱讀 1055

/*

短時間鎖定的情況下,自旋鎖(spinlock)更快。(因為自旋鎖本質上不會讓執行緒休眠,而是一直迴圈嘗試對資源訪問,直到可用。所以自旋鎖線程被阻塞時,不進行執行緒上下文切換,而是空轉等待。對於多核cpu而言,減少了切換執行緒上下文的開銷,從而提高了效能。)

*/class program

//spinlock是net4.0後net提供的自旋鎖類庫,內部做了優化。

//從源**中發現spinlock並不是簡單的實現那樣一直自旋,其內部做了很多優化。

//1:內部使用了interlocked.compareexchange保持原子操作, m_owner 0可用,1不可用。

//2:第一次獲得鎖失敗後,繼續呼叫continuetryenter,continuetryenter有三種獲得鎖的情況。

//3:continuetryenter函式第一種獲得鎖的方式,使用了while+spinwait。

//4:第一種方式達到最大等待者數量後,命中走第二種。 繼續自旋 turn * 100次。100這個值是處理器核數(4, 8 ,16)下最好的。

//5:第二種如果還不能獲得鎖,走第三種。這種就帶有混合構造的意思了,如下:

//簡單看下例項:

public void foo1()

}finally

});li.foreach((rr) => console.writeline(rr));

}//下面就是自旋鎖:interlocked.exchange+while

//1:定義signal 0可用,1不可用。

//2:parallel模擬併發競爭,原子更改signal狀態。 後續執行緒自旋訪問signal,是否可用。

//3:a執行緒使用完後,更改signal為0。 剩餘執行緒競爭訪問資源,b執行緒勝利後,更改signal為1,失敗執行緒繼續自旋,直到可用。

public void foo5()

li.add(r);

interlocked.exchange(ref signal, 0); //釋放鎖

});}

}

執行緒同步 自旋鎖 SpinLock

自旋鎖 spinlock 是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出迴圈。什麼情況下使用自旋鎖 自旋鎖非常有助於避免阻塞,但是如果預期有大量阻塞,由於旋轉過多,您可能不應該使用自旋鎖。當鎖是細粒度的並且...

linux多執行緒之自旋鎖

基本概念 何謂自旋鎖?它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,...

posix多執行緒有感 自旋鎖

自旋鎖是smp架構中的一種low level的同步機制。當執行緒a想要獲取一把自旋鎖而該鎖又被其它執行緒鎖持有時,執行緒a會在乙個迴圈中自旋以檢測鎖是不是已經可用了。對於自選鎖需要注意 使用任何鎖需要消耗系統資源 記憶體資源和cpu時間 這種資源消耗可以分為兩類 建立鎖所需要的資源 當執行緒被阻塞時...