C における一般的な同時コレクションとスレッド セーフティの問題
#C# プログラミングでは、同時操作の処理は非常に一般的な要件です。スレッドの安全性の問題は、複数のスレッドが同時に同じデータにアクセスして変更する場合に発生します。この問題を解決するために、C# はいくつかの同時コレクションおよびスレッド セーフ メカニズムを提供します。この記事では、C# の一般的な同時コレクションとスレッド セーフティの問題に対処する方法を紹介し、具体的なコード例を示します。
1.1 ConcurrentDictionary
ConcurrentDictionary は、C# で一般的に使用される同時辞書コレクションであり、複数のスレッドが同時に読み書きできるようにします。 time 異なるキーと値のペアを使用し、スレッドの同期を自動的に処理するメカニズムを提供します。以下は、ConcurrentDictionary の使用例です。
ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>(); // 添加键值对 concurrentDict.TryAdd("key1", 1); concurrentDict.TryAdd("key2", 2); // 更新值 concurrentDict.TryUpdate("key1", 3, 1); // 删除键值对 int value; concurrentDict.TryRemove("key2", out value);
1.2 ConcurrentQueue
ConcurrentQueue は、C# のスレッドセーフなキュー コレクションであり、複数のスレッドがキューの最後に要素を追加できるようにします。同時にキューの先頭で取得し、要素を削除します。 ConcurrentQueue の使用例を次に示します。
ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>(); // 入队 concurrentQueue.Enqueue(1); concurrentQueue.Enqueue(2); // 出队 int result; if(concurrentQueue.TryDequeue(out result)) { // 处理出队的元素 }
1.3 ConcurrentBag
ConcurrentBag は、複数のスレッドが同時に要素を追加および削除できるようにする、C# のスレッドセーフな順序なしコレクションです。 ConcurrentBag の使用例を次に示します。
ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>(); // 添加元素 concurrentBag.Add(1); concurrentBag.Add(2); // 移除元素 int result; if(concurrentBag.TryTake(out result)) { // 处理移除的元素 }
2.1 競合状態
競合状態は、複数のスレッド ペアを参照します。共有リソースの順序が結果の不確実性につながります。競合状態を解決するために、ロック メカニズム (ロック) を使用して、共有リソースへのマルチスレッド アクセスの相互排他を確保できます。以下は、ロックを使用して競合状態を解決する例です。
class Counter { private int count; public void Increment() { lock (this) { count++; } } public int GetCount() { lock (this) { return count; } } }
2.2 デッドロック
デッドロックとは、複数のスレッドが互いにリソースを解放するのを待機しており、プログラムが実行を継続できなくなります。デッドロックを回避するには、同じ順序でロックを取得するか、try-finally ステートメントを使用してリソースが正常に解放されるようにします。以下は、単純なデッドロックの例です。
class Deadlock { private static object lock1 = new object(); private static object lock2 = new object(); static void Main(string[] args) { Thread thread1 = new Thread(() => { lock (lock1) { Thread.Sleep(1000); // 为了让另一个线程有机会获取lock2 lock (lock2) { // do something } } }); Thread thread2 = new Thread(() => { lock (lock2) { Thread.Sleep(1000); // 为了让另一个线程有机会获取lock1 lock (lock1) { // do something } } }); thread1.Start(); thread2.Start(); } }
上記は、C# における一般的な同時コレクションとスレッド セーフティの問題、および特定のコード例の紹介です。並行プログラミングを行う場合は、これらのメカニズムと問題を理解し、スレッドの安全性を確保するために適切なソリューションを選択する必要があります。同時コレクションを正しく使用し、スレッドの安全性の問題を回避することで、プログラムのパフォーマンスと信頼性を向上させることができます。
以上がC# における一般的な同時コレクションとスレッド セーフティの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。