0

スレッドセーフについて何か読んだことがありますが、ロックをかけるために必要な操作について理解したいと思います。

たとえば、スレッドセーフキューが必要だとします/ deqeue操作が最初の要素を返す場合(存在する場合)、いつロックが必要ですか?エントリに抽象的なリンクリストを使用しているとしましょう。

書き込みアクションをロックする必要がありますか?またはものを読んでいますか?または両方?

誰かが私にこれを説明するか、私にいくつかのリンクを与えることができるかどうかを願っています。

4

6 に答える 6

1

並行シナリオでの同期は非常に幅広いトピックです。基本的に、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
}

上記は、一部のデータ構造によってシングルスレッドセーフな操作として実装される場合があることに注意してください。ただし、ここで指摘しようとしています。

于 2012-09-16T19:25:42.670 に答える
1

私が見つけたロックとスレッドの最良のガイドは、このページです(これは、ロックとスレッドを操作するときに参照するテキストです)。

http://www.albahari.com/threading/

「ロックとスレッドセーフ」という段落が必要ですが、残りの部分も読んでください。非常によく書かれています。

于 2012-09-17T07:20:11.073 に答える
0

基本的な概要については、MSDN:スレッドの同期を参照してください。より詳細な紹介については、Amazon:Windowsでの並行プログラミングを読むことをお勧めします。

于 2012-09-16T19:21:39.680 に答える
0

非アトミック操作の対象となるオブジェクトをロックする必要があります。

リストにオブジェクトを追加->非アトミック

バイトまたはintに値を与える->アトミ​​ック

于 2012-09-16T19:21:50.903 に答える
0

最も簡単な経験則として、すべての共有可変データには、アクセス中にロックをロックする必要があります。

同じフィールドを同時に書き込んでいる人がいないことを確認する必要があるため、書き込むときはロックが必要です。

別のスレッドがデータの書き込みの途中である可能性があり、一貫性のない状態になる可能性があるため、読み取り時にロックする必要があります。不整合なデータは、誤った出力やクラッシュを引き起こす可能性があります。

ロックには独自の問題があります(Googleは「食事する哲学者」を意味します)。そのため、可能な限り明示的なロックの使用を避ける傾向があります。ConcurrentQueue <>のような高レベルのビルディングブロックはエラーが発生しにくいですが、それでもドキュメントを読む必要があります。

ロックを回避するもう1つの簡単な方法は、バックグラウンドプロセスの入力データのコピーを作成することです。または、不変の入力(変更できないデータ)を使用することをお勧めします。

于 2012-09-16T19:48:54.393 に答える
0

ロックの基本ルール

  • 同じものを同時に変更しても飛ばない
  • 変化しているものを読んでも飛ばない
  • 同じことを同時に読むと飛ぶ
  • 異なるものを同時に変更すると飛ぶ可能性があります

ロックは、飛ばない状況を防ぐ必要があります。これは多くの方法で行うことができます。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

于 2012-09-17T07:10:12.273 に答える