12,796
回編集
(→例外処理) |
(→排他処理) |
||
334行目: | 334行目: | ||
== 排他処理 == | == 排他処理 == | ||
排他処理を行う場合、<code>lock</code>キーワードが基本的かつ一般的な方法である。<br> | |||
しかし、状況や要件によっては他の手法も考慮する。<br> | |||
<br> | |||
<code>lock</code>キーワード以外にも以下に示すような選択肢がある。<br> | |||
* Monitorクラス | |||
*: lockキーワードは内部的に<code>Monitor</code>クラスを使用している。 | |||
*: <code>Monitor</code>クラスを直接使用する場合、より細かい制御が可能になる。 | |||
*: <br> | |||
* Mutexクラス | |||
*: プロセス間の同期に使用する。 | |||
*: 複数のアプリケーションインスタンス間での排他制御が必要な場合に適している。 | |||
*: <br> | |||
* Semaphore / SemaphoreSlim | |||
*: リソースへのアクセスを制限する必要がある場合に使用する。 | |||
*: 例えば、同時に最大N個のスレッドがリソースにアクセスできるようにする場合等である。 | |||
*: <br> | |||
* ReaderWriterLockSlim | |||
*: 読み取り操作が書き込み操作よりも頻繁に行われる場合に適している。 | |||
*: 複数の読み取りスレッドを同時に許可しながら、書き込みを排他的に行うことができる。 | |||
*: <br> | |||
* Interlockedクラス | |||
*: 単一の変数に対する原子的操作 (インクリメント、デクリメント、交換等) を提供する。 | |||
*: <br> | |||
* SpinLock構造体 | |||
*: 非常に短い時間だけロックが必要な場合に使用する。 | |||
*: CPUリソースを多く消費するが、コンテキストスイッチのオーバーヘッドを避けることができる。 | |||
<br> | |||
* 選択の基準 | |||
** 同期の範囲 | |||
**: 単一のアプリケーション内か、プロセス間か | |||
** 操作の粒度 | |||
**: 細かい操作か、大きなブロックか | |||
** パフォーマンス要件 | |||
**: 高頻度の短い操作か、低頻度の長い操作か | |||
** 読み書きのバランス | |||
**: 読み取りと書き込みの頻度のバランス | |||
<br> | |||
==== lockキーワードの使用 ==== | ==== lockキーワードの使用 ==== | ||
lockキーワードのメリットと特徴を以下に示す。<br> | |||
* 使いやすさ | |||
*: シンプルで直感的な構文を持つ。 | |||
* 安全性 | |||
*: デッドロックのリスクを軽減する。(ただし、完全に防ぐわけではない) | |||
* パフォーマンス | |||
*: 比較的軽量な操作である。 | |||
<br> | |||
以下の例では、排他処理 (<code>lock</code>キーワード) を使用してテキストファイルを2つのスレッドから読み書きしている。<br> | 以下の例では、排他処理 (<code>lock</code>キーワード) を使用してテキストファイルを2つのスレッドから読み書きしている。<br> | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> |