MENU

C#のList (Concurrent Collections)入門:並行処理のための安全なデータ構造

C#プログラミングにおいて、マルチスレッド環境での安全なデータ操作は重要な課題です。今回は、この課題に対する解決策の一つである「Concurrent Collections」、特にその中でも広く使用されている「ConcurrentBag<T>」について解説します。

目次

自己紹介

私は新卒でFAシステムの開発会社に入社した2年目エンジニアです。(2024年時点)

私はC#とVBを学習中なのでブログを見返す用のメモ代わりに活用しています。私の知識を共有し、皆様の学習のサポートとなれば幸いです。

Concurrent Collectionsとは

Concurrent Collectionsは、C#のSystem.Collections.Concurrent名前空間に含まれる、マルチスレッド環境での使用に最適化されたコレクションクラス群です。これらのコレクションは、複数のスレッドから同時にアクセスされても、データの整合性を保つように設計されています。

ConcurrentBag<T>の特徴

ConcurrentBag<T>は、Concurrent Collectionsの一つで、以下の特徴があります:

  1. スレッドセーフ: 複数のスレッドから同時にアクセスしても安全です。
  2. 順序不定: 要素の追加順序は保持されません。
  3. 重複許容: 同じ値を持つ要素を複数含むことができます。
  4. 高性能: 内部で効率的なロック機構を使用しています。

では、実際にConcurrentBag<T>を使用するコード例を見てみましょう:

using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        // ConcurrentBag<T>の作成
        ConcurrentBag<int> numbers = new ConcurrentBag<int>();

        // 並行してデータを追加
        Parallel.For(0, 10, i =>
        {
            numbers.Add(i);
            Console.WriteLine($"Added: {i}");
        });

        // 要素数の表示
        Console.WriteLine($"Total count: {numbers.Count}");

        // すべての要素を表示
        Console.WriteLine("All numbers:");
        foreach (var number in numbers)
        {
            Console.WriteLine(number);
        }

        // 要素の取り出し
        if (numbers.TryTake(out int result))
        {
            Console.WriteLine($"Taken: {result}");
        }

        // 要素の参照
        if (numbers.TryPeek(out int peeked))
        {
            Console.WriteLine($"Peeked: {peeked}");
        }
    }
}

このコードでは、ConcurrentBag<T>の基本的な操作を示しています:

  1. ConcurrentBag<int>のインスタンスを作成します。
  2. Parallel.Forを使用して、複数のスレッドから同時に要素を追加します。
  3. コレクションの要素数を表示します。
  4. すべての要素を表示します(順序は不定です)。
  5. TryTakeメソッドを使用して要素を取り出します。
  6. TryPeekメソッドを使用して要素を参照します。

ConcurrentBag<T>の使用場面

ConcurrentBag<T>は以下のような状況で特に有用です:

  • 複数のスレッドが同時にデータを生成し、それらを一箇所に集める場合
  • 要素の順序が重要でない場合
  • 生産者と消費者のパターンを実装する場合

注意点

  1. 要素の順序が保証されないため、順序が重要な場合は他のコレクションを検討してください。
  2. 特定の要素を検索したり、除去したりする操作は効率的ではありません。
  3. メモリ使用量が他のコレクションより多くなる可能性があります。

まとめ

ConcurrentBag<T>は、C#でマルチスレッドプログラミングを行う際の強力なツールです。適切な使用により、データ競合を避け、効率的な並行処理を実現できます。

初心者の方々も、マルチスレッドプログラミングの基礎を学ぶ過程で、ConcurrentBag<T>の概念を理解することは有益です。実際にコードを書いて試すことで、並行処理の挙動をより深く理解できるでしょう。

その他のListに関する記事一覧

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次