C 的無鎖資料結構在工業界有真正的應用嗎?

時間 2021-05-12 14:20:25

1樓:氯乙烯

該加鎖就必須加鎖,一般情況下如果效能消耗主要鎖造成的,那是設計的問題,鎖一般是在工作執行緒處理完成之後與使用者執行緒提交結果時候用到,消耗主要在工作執行緒。

2樓:白楊

我見過的大部分無鎖演算法,以及上面各位提到的大部分實現,其實本質上都是某種形式的 spin 演算法。

這與其叫「無鎖演算法」,我覺得不如叫全使用者態鎖(Full User Mode Lock)演算法來的更貼切一點——在多執行緒併發訪問衝突的時候還是要回歸到乙個執行緒成功訪問,其它執行緒等待的傳統鎖模式,只不過不用切換進 Kernel Mode,代價是可能產生大量的 CPU 開銷。我向使用者介紹我們的這類元件的時候都是以「純使用者態……」來描述,從不敢說「無鎖」。

真正能做到不用浪費時間去做 spin 動作,還能同時保持多執行緒安全性的,也就只有為每個物件分配(選舉)其屬主線程(僅該執行緒擁有此物件的訪問所有權)之類的演算法了。但這樣侷限性較大,想用好難度也比較高。

因為這不是乙個單一的容器(這裡容器指佇列、鍊錶等資料結構)演算法能解決,而是要在產品的架構和模式設計上就做出改變,比如 Google 的 Maglev。

3樓:湯禮

我在我們公司的專案中用了boost::lockfree。關於這個問題,我覺得應該先搞清楚幾個前提:

1.為什麼要用鎖,可不可不用鎖;2.什麼是lockfree,為什麼要用lookfree。

關於1,上鎖的目的解決多執行緒訪問共享資源出現的競態情形(race condition,國內大多翻譯成競態條件,我覺得這個翻譯讓人莫名其妙)。那可不可以不用鎖呢,共享的資源一定要共享嗎?看情況而定。

在某些場景下,『共享』的資源實際上是不一定非得共享,完全可以給每個執行緒分配乙份需要的資源,這樣就避免了競態情形,就沒有上鎖的必要了。當然某些情況下共享資源是不可避免要存在,這樣就有必要上鎖了。

關於2,我對lockfree的理解是lockfree只是不需要程式設計師顯式呼叫加/解鎖的操作了,實際上鎖還是存在,只是這個鎖在更底層實現了,並且鎖的粒度也足夠小。如果我把std::queue封裝一下,每個介面實現裡起始都加個加/解鎖的呼叫,那是不是也可以叫這個是lookfree的佇列了呢?

現實而言,鎖的使用增加了程式設計複雜度,特別是對新手來說,一不小心就來了個死鎖,並且非常難於除錯。所以我覺得lockfree的意義在於去掉了對鎖操作的顯式呼叫,降低了程式設計複雜度。至於有鎖和無鎖的效能差別的問題,我的專案中沒有具體比較過,但是總體而言,lookfree的效能並不是影響總體效能的瓶頸。

我想大多數業務場景也是這樣,當然這個要具體問題具體分析了。

4樓:下雨了

曾經去乙個安全公司面試過,和面試官聊到過這個話題,最後的結論是:所有邏輯上有鎖的,在實現上,都需要鎖。所謂的無鎖,只是在你的層面上無鎖,更低層的,必定有鎖的存在。

就算在軟體上無鎖,硬體上必定存在!

5樓:範禹

有點類似powerpc 彙編這種技術,全球只需要幾十個人懂就好了,沒必要每個人都精通,普通程式設計師使用lockfree,極容易犯錯,也沒有太大收益

6樓:

匿名。來自答主提到的公司。

題主太小看工業資料結構的複雜度了。

線性的lockfree資料結構(array, queue, stack甚至hashtable )實現都相當簡單。

測試的話大量的stress test基本是足夠cover全部的。

很多的database不用這個的主要的原因是大部分索引使用btree做的 lockfree的btree太喪心病狂了

7樓:大黃

多執行緒伺服器會使用,以下列舉一些場景:

1. 非同步處理,使用lockfree queue,比如,非同步打日誌提高伺服器效能;

2. monitor,使用atom操作,lockfree結構儲存需要多執行緒merge的資料;

3. index;

4. 記憶體資料,尤其是需要支援server不重啟,load記憶體的這種;

8樓:

lock free的演算法在底層系統軟體中應用不少,例如核心的rcu鎖;跟乙個sybase核心工程師聊過,他們在記憶體中修改B+樹根節點時會用到類似的技術,為了防止大面積的cpu cache失效和spinlock開銷。具體的演算法實現可能各有不同,但是目的和效果是一致的。

9樓:

所謂的環形緩衝區(ring buffer),如果只有乙個讀執行緒、乙個寫執行緒,二者沒有共享的被修改的控制變數,那麼可以證明這種情況下不需要併發控制。Linux核心檔案kfifo.h和kfifo.

c中,就實現了乙個環形緩衝區(ring buffer)。

參見:https://

zh.wikipedia.org/wiki/%E7%92%B0%E5%BD%A2%E7%B7%A9%E8%A1%9D%E5%8D%80

10樓:語冰

Lock-free資料結構實際應用中意義並不大,個人認為主要的問題除了實現難度大、正確性不容易保證之外,主要是以下兩點:

1. Lock-free並不能解決contention的問題,而contention往往都可以通過對問題本身的重構進行解決,比如由Shared Address Memory轉變為Message Passing或者將二者結合。

2. Spinning的目的是通過消耗額外的資源來減少執行緒排程的時間,而這乙個需求在一般的應用中並不常見。

換言之,除非是企業核心服務的瓶頸,或者在科學研究中為了快速地解決極其複雜的問題,否則將時間投入到對問題的重構中往往可以獲得更好的並行效果。

從另外乙個方面說,lock-free不應該跟最簡單的帶鎖資料結構比較。設計良好的多段鎖資料結構或者日漸完善的關鍵區優化使用得當的話都可以獲得可觀的加速和更好的易用性。

11樓:范子逸

C語言的無鎖結構在Linux核心中有非常多的應用。

但是都用了C++了,我覺得無鎖帶來的效能提公升不能抵消複雜度增長導致的維護困難吧。

機器學習模型在工業界的應用?

哈哈哈 參照另乙個回答 基於神經網路的現實中的應用?哈哈哈的回答 知乎 基於神經網路的現實中的應用?機器學習大多是應用在影象 語音和文字,也能用於旋轉機械故障診斷。在本質上,旋轉機械故障診斷是乙個分類的問題。例如,常見的機械故障包括軸承滾動體故障 外圈道故障 內圈道故障,齒根裂紋 齒麵點蝕 缺齒故障...

C 語言有哪些復用資料結構的方法?

myd7349 我找到的一些資料 還有一些庫實現 甚至語言 ooc language,提供了乙個叫做 rock 的編譯器 2.就是前面回答的知友提到的用 void 型別的指標來實現泛型。這也有一些例子 nanomsg 實現的 list,queue 等資料結構 nanomsg src utils at...

分析化學在工業界的現狀和未來是什麼?

梓凡 題主問工業界儀器分析現狀,感覺很多人答跑題了,但題主明顯也是未入此行,不太了解分析在日化領域應用和行業現狀的。個人有過第三方檢測機構的工作經歷,接觸到的有儀器公司工作的同行,也有題主所說做工業界儀器分析工作的。但個人經歷淺薄,如果有什麼疏漏或錯誤希望各位指出來我好修改掉。先回答工業界問題,目前...