ホームページ >バックエンド開発 >C#.Net チュートリアル >C# における一般的な同時コレクションとスレッド セーフティの問題

C# における一般的な同時コレクションとスレッド セーフティの問題

WBOY
WBOYオリジナル
2023-10-09 22:49:021348ブラウズ

C# における一般的な同時コレクションとスレッド セーフティの問題

C における一般的な同時コレクションとスレッド セーフティの問題

#C# プログラミングでは、同時操作の処理は非常に一般的な要件です。スレッドの安全性の問題は、複数のスレッドが同時に同じデータにアクセスして変更する場合に発生します。この問題を解決するために、C# はいくつかの同時コレクションおよびスレッド セーフ メカニズムを提供します。この記事では、C# の一般的な同時コレクションとスレッド セーフティの問題に対処する方法を紹介し、具体的なコード例を示します。

  1. 同時コレクション

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))
{
    // 处理移除的元素
}
  1. スレッドの安全性の問題

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。