C#で並列処理中のスレッドごとにリストをロックする方法


C#で並列処理を行っている中で、スレッドごとにリストを安全に操作するためには、ロックを使用する必要があります。以下に、いくつかの方法とコード例を示します。

  1. ロックオブジェクトを使用する方法:

    private static readonly object lockObject = new object();
    private static List<int> myList = new List<int>();
    // ロックを使用してリストを操作するメソッド
    private static void ModifyList(int item)
    {
       lock (lockObject)
       {
           // リストにアイテムを追加するなどの処理
           myList.Add(item);
       }
    }
    // 並列処理のメソッド
    private static void ParallelMethod()
    {
       // 並列処理でリストを操作する
       Parallel.ForEach(myList, item =>
       {
           // リストのアイテムを操作する処理
           ModifyList(item);
       });
    }
  2. Monitorクラスを使用する方法:

    private static List<int> myList = new List<int>();
    // ロックを使用してリストを操作するメソッド
    private static void ModifyList(int item)
    {
       bool lockTaken = false;
       try
       {
           Monitor.Enter(myList, ref lockTaken);
           // リストにアイテムを追加するなどの処理
           myList.Add(item);
       }
       finally
       {
           if (lockTaken)
               Monitor.Exit(myList);
       }
    }
    // 並列処理のメソッド
    private static void ParallelMethod()
    {
       // 並列処理でリストを操作する
       Parallel.ForEach(myList, item =>
       {
           // リストのアイテムを操作する処理
           ModifyList(item);
       });
    }

以上の方法を使用することで、C#で並列処理中のスレッドごとにリストをロックして、競合状態やデータ破損を防ぐことができます。必要に応じて、他の同期メカニズムやデータ構造を使用することもできますが、ロックを使用する方法が一般的な解決策となります。注意点としては、ロック範囲を最小限に保つことが重要です。また、ロックの過剰使用はパフォーマンスの低下を引き起こす可能性があるため、適切なバランスを保つ必要があります。