スレッドセーフについて何か読んだことがありますが、ロックをかけるために必要な操作について理解したいと思います。
たとえば、スレッドセーフキューが必要だとします/ deqeue操作が最初の要素を返す場合(存在する場合)、いつロックが必要ですか?エントリに抽象的なリンクリストを使用しているとしましょう。
書き込みアクションをロックする必要がありますか?またはものを読んでいますか?または両方?
誰かが私にこれを説明するか、私にいくつかのリンクを与えることができるかどうかを願っています。
スレッドセーフについて何か読んだことがありますが、ロックをかけるために必要な操作について理解したいと思います。
たとえば、スレッドセーフキューが必要だとします/ deqeue操作が最初の要素を返す場合(存在する場合)、いつロックが必要ですか?エントリに抽象的なリンクリストを使用しているとしましょう。
書き込みアクションをロックする必要がありますか?またはものを読んでいますか?または両方?
誰かが私にこれを説明するか、私にいくつかのリンクを与えることができるかどうかを願っています。
並行シナリオでの同期は非常に幅広いトピックです。基本的に、2つ以上のスレッドがそれらの間で何らかの共有状態(カウンター、データ構造)を持ち、それらの少なくとも1つが別のスレッドからの読み取りまたは別の変更と同時にこの共有状態を変更する場合は常に、結果に一貫性がない可能性があります。このような場合、何らかの形式の同期を使用する必要があります(そのロックはフレーバーです)。
ここで質問に移りますが、デキューを実行する一般的なコードは次のとおりです(擬似コード)。
if(queue is not empty)
queue.dequeue
これは、複数のスレッドによって同時に実行される場合があります。一部のキュー実装は、queue is not empty
操作と操作の両方を内部的に同期queue.dequeue
しますが、上記のコードを実行するスレッドがチェックと実際のデキューの間で中断される可能性があるため、デキューに到達したときにキューが空であると感じるスレッドもあります。チェックがtrueを返したとしても。シーケンス全体をロックする必要があります。
lock(locker)
{
if(queue is not empty)
queue.dequeue
}
上記は、一部のデータ構造によってシングルスレッドセーフな操作として実装される場合があることに注意してください。ただし、ここで指摘しようとしています。
私が見つけたロックとスレッドの最良のガイドは、このページです(これは、ロックとスレッドを操作するときに参照するテキストです)。
http://www.albahari.com/threading/
「ロックとスレッドセーフ」という段落が必要ですが、残りの部分も読んでください。非常によく書かれています。
基本的な概要については、MSDN:スレッドの同期を参照してください。より詳細な紹介については、Amazon:Windowsでの並行プログラミングを読むことをお勧めします。
非アトミック操作の対象となるオブジェクトをロックする必要があります。
リストにオブジェクトを追加->非アトミック
バイトまたはintに値を与える->アトミック
最も簡単な経験則として、すべての共有可変データには、アクセス中にロックをロックする必要があります。
同じフィールドを同時に書き込んでいる人がいないことを確認する必要があるため、書き込むときはロックが必要です。
別のスレッドがデータの書き込みの途中である可能性があり、一貫性のない状態になる可能性があるため、読み取り時にロックする必要があります。不整合なデータは、誤った出力やクラッシュを引き起こす可能性があります。
ロックには独自の問題があります(Googleは「食事する哲学者」を意味します)。そのため、可能な限り明示的なロックの使用を避ける傾向があります。ConcurrentQueue <>のような高レベルのビルディングブロックはエラーが発生しにくいですが、それでもドキュメントを読む必要があります。
ロックを回避するもう1つの簡単な方法は、バックグラウンドプロセスの入力データのコピーを作成することです。または、不変の入力(変更できないデータ)を使用することをお勧めします。
ロックの基本ルール
ロックは、飛ばない状況を防ぐ必要があります。これは多くの方法で行うことができます。C#は、このための多くのツールを提供します。ConcurrentDictionary、ConcurrentQueueなどのConcurrent <>コレクションタイプの中でも特に、ReaderWriterLockSlimなどもあります。
マイクロソフトからのこの無料の.pdfが役立つかもしれません。これは「C#スレッドを使用したプログラミング入門」と呼ばれます。
http://research.microsoft.com/pubs/70177/tr-2005-68.pdf
これはややユーモラスなリレーです
http://www.codeproject.com/Articles/114262/6-ways-of-doing-locking-in-NET-Pessimistic-and-opt