並行処理と並列処理
並行処理は複数の処理を進行させる構成、並列処理は複数の処理を同時に実行することを指します。複数スレッドは並列実行の手段の一つですが、非同期I/Oは必ずしも専用スレッドを必要としません。
共有状態の競合
複数の処理が同じデータを同時に読み書きすると、実行順序によって結果が変わる競合状態が発生します。単純な加算であっても、読み取り・変更・書き込みが一体で行われるとは限りません。
同期の選択
- lock:短いクリティカルセクションを保護する。
- Interlocked:単純な数値更新などを原子的に行う。
- ConcurrentDictionaryなど:並行利用を想定したコレクションを使う。
- Channelなど:データを受け渡す構成にする。
注意点
ロックの取り方によってデッドロックが発生することがあります。ロック順序を統一し、ロック中に外部コードや時間のかかる処理を実行しない設計を心がけます。