C# ConcurrentCollections

ConcurrentCollectionsでスレッドセーフなデータ操作ができる。
ただし、RaceCondition(メソッド呼び出し間に、別スレッド・プロセスの操作により値が書き換わる現象)に注意する。

言語が違っても考え方は同じと思うので、メモしておく。

ConcurrentQueue

スレッドセーフなキュー(FIFO)。

  1. Enqueue
  2. TryDequeue

ConcurrentDictionary

一般的な用途ならこれで十分。
配列として使う場合はスレッドセーフと引き換えに性能が犠牲になる。

  1. TryGetValue
  2. TryAdd
  3. TryUpdate
  4. TryRemove
  5. GetOrAdd
  6. AddOrUpdate

Parallel.ForEach

ループを分割して処理を行う。
ブロック内の処理負荷が大きいほど効果がかる。
こういうものもあるんだなということで。

RaceConditions回避

  1. delegate使用
  2. atomicな操作をする
  3. lockをかける(ただし、手動でロックをかけるため、デッドロックが起こる可能性がある)