2

新しく改良されたロガーコンポーネント(.NET 3.5、C#)を設計しています。

ロックフリーの実装を使用したいと思います。

ロギングイベントは(潜在的に)複数のスレッドから送信されますが、ファイル/他のストレージメディアへの実際の出力は単一のスレッドのみが行います。

本質的に、すべてのライターは、他のプロセス(LogFileWriter)によって取得されるように、データをキューに*キューイング*しています。

これはロックなしの方法で達成できますか?ネット上でこの特定の問題への直接の参照を見つけることができませんでした。

4

3 に答える 3

13

この場合にロックを使用するのが遅すぎることに気付いた場合は、はるかに大きな問題があります。ロックが競合していない場合、私のシステム(2.0 GHz Core 2 Quad)では約75ナノ秒かかります。もちろん、それが争われるとき、それは幾分長くかかるでしょう。Enqueueただし、ロックはまたはへの呼び出しを保護しているだけなのでDequeue、ログ書き込みの合計時間が75ナノ秒をはるかに超える可能性はほとんどありません。

ロック問題である場合、つまり、スレッドがそのロックの背後に並んでいて、アプリケーションで顕著な速度低下を引き起こしている場合は、ロックフリーキューを作成してもあまり役に立たない可能性があります。なんで?実際にログに大量の書き込みを行っている場合、ロックフリーのブロッキングキューが非常に速くいっぱいになり、I/Oサブシステムの速度に制限されるためです。

Queue<string>単純なロックで保護されているに、1秒間に200ログエントリのオーダーで書き込むマルチスレッドアプリケーションがあります 。重大なロックの競合に気づいたことはなく、処理が少しでも遅くなることはありません。その75nsは、他のすべてを実行するのにかかる時間によって小さくなります。

于 2012-01-05T01:20:35.417 に答える
5

このロックフリーキューの実装は、キューが、ロガーによってデキューおよび書き出されるアイテムをエンキューするために使用するデータ構造である場合に役立つ可能性があります。

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

.Net4の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

于 2012-01-05T00:02:20.093 に答える
0

そこには、ロックフリーキューのかなりの数の異なる実装があります。

私自身のhttp://hackcraft.github.com/Ariadne/は単純なアプローチを使用しており、オープンソースであるため、必要に応じて適応させることができます。

ConcurrerntQueueまた、ロックフリーであり、おそらくほとんどの目的に適していますが、Ariadneには、他の操作をサポートするメンバーがいくつかあります(コンテンツ全体の列挙をアトミック操作としてデキューすることで、単一のコンシューマーによる列挙を高速化できます)。

于 2012-01-05T15:18:21.650 に答える