lockfree
是用標準 C++11 編寫的無鎖定資料結構的集合,適用於從深度嵌入式到 HPC 的所有平台。
無鎖資料結構是執行緒和中斷安全的資料結構,可以並發使用,而無需使用互斥機制。它們對於進程間通訊最有用,並且在操作和執行緒數量方面通常比基於鎖的結構更好地擴展。
lockfree
這些資料結構的效能較高,通常應在只有一個執行緒/中斷推送資料而另一個執行緒/中斷檢索資料時使用。
這些資料結構更通用,同時支援多個生產者和消費者,但是與單一生產者單一消費者資料結構相比,它們具有儲存和效能開銷。它們還需要一些低階微控制器可能缺少的原子指令。
取得該庫的方式主要有以下三種:
lockfree
預設對索引使用cacheline對齊來避免FalseSharing現象,避免了cachecoherent系統上cacheline失效帶來的效能損失。這會將索引與LOCKFREE_CACHELINE_LENGTH
對齊,預設為64
。
在嵌入式系統上, LOCKFREE_CACHE_COHERENT
幾乎應始終設定為false
以避免浪費記憶體。
此外,某些系統具有非典型的快取行長度(例如蘋果 M1/M2 CPU 的快取行長度為 128 位元組),在這些情況下應相應地設定LOCKFREE_CACHELINE_LENGTH
。
lockfree
中的所有資料結構僅適用於普通類型。
您希望在託管環境中使用無鎖定資料結構的最大原因是避免與鎖定有關的問題,例如死鎖、優先反轉和不確定性存取延遲。如果使用得當,無鎖資料結構在某些場景下還可以提高效能。
此外, lockfree
提供了一種建立應用程式和函式庫的方法,這些應用程式和函式庫可以編譯為在 POSIX 和非 POSIX 環境中工作,而無需#ifdef
或多態性。
雖然鎖定在微控制器等嵌入式系統上通常並不昂貴,但 RTOS 種類繁多,並且沒有用於鎖定的標準化 API。事實上,從 8051 到 RISC-V 存在多種架構,這意味著中斷管理方法也沒有標準化。
lockfree
提供了一種建立可移植嵌入式程式碼的方法,與鎖定相比,效能成本可以忽略不計,使用lockfree
程式碼可以編譯為在任何支援 C++11 的嵌入式平台上運行。此外,程式碼可以輕鬆地在主機上進行測試,而無需進行模擬。
lockfree
中資料結構的正式分類是什麼? lockfree
中的所有結構都是有界的、基於陣列且無鎖的,spsc 資料結構也是waitfree和終止安全的。
若想更深入了解無鎖編程,請查看: