簡體   English   中英

實現無鎖隊列(對於Logger組件)

[英]Implementing a lock-free queue (for a Logger component)

我正在設計一個新的改進的Logger組件(.NET 3.5,C#)。

我想使用無鎖實現。

記錄事件將從(潛在地)多個線程被發送,盡管只有一個線程將執行實際輸出到文件/其它存儲介質。

從本質上講,所有的編寫器都將它們的數據排入某個隊列,然后通過其他一些進程(LogFileWriter)進行檢索。

這可以通過無鎖方式實現嗎? 我無法在網上找到這個特定問題的直接參考。

如果您發現在這種情況下使用鎖定太慢,則會出現更大的問題。 鎖定,當它沒有爭用時,在我的系統上需要大約75納秒(2.0 GHz Core 2 Quad)。 當它爭論時,當然,它需要更長的時間。 但由於鎖只是保護對EnqueueDequeue的調用,因此日志寫入的總時間不可能遠遠超過75納秒。

如果鎖一個問題 - 也就是說,如果你發現你的線程排在該鎖后面並導致你的應用程序顯着減速 - 那么建立一個無鎖隊列就不太可能有所幫助。 為什么? 因為如果你真的那么多地寫入日志,那么你的無鎖阻塞隊列將會如此快地填滿,你將被限制在I / O子系統的速度上。

我有一個多線程應用程序,每秒寫入200個日志條目的順序到一個受簡單鎖保護的Queue<string> 我從來沒有注意到任何明顯的鎖爭用,並且處理速度不會太慢。 75 ns與其他所有事情相比已經相形見絀了。

這種無鎖隊列的實現可能會有所幫助,其中隊列是您用於將要出列的項目入隊並由記錄器寫出的數據結構。

http://www.boyet.com/Articles/LockfreeQueue.html

您也可以查看.Net 4的ConcurrentQueue

http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections

http://geekswithblogs.net/BlackRabbitCoder/archive/2011/02/10/c.net-little-wonders-the-concurrent-collections-1-of-3.aspx

那里有無鎖隊列的不同實現。

我自己在http://hackcraft.github.com/Ariadne/上使用了一種簡單的方法,並且是開源的,因此您可以根據需要進行調整。

ConcurrerntQueue也是無鎖的,並且很可能用於大多數目的,盡管在Ariadne中有一些成員支持其他操作(例如將整個內容的枚舉作為原子操作出列,允許單個消費者更快地枚舉) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM