[C#] StringBuilder は ThreadSafe か?

2014年8月10日

 StringBuilder は ThreadSafe かどうか試してみた。

 結果

37330 回目に失敗
結果の文字列長   : 10016
結果の先頭50文字 : OOOOOOOOOOOOOOO...................................
続行するには何かキーを押してください . . .

 壊れることはあるみたいですね…
 (この例では、先頭17文字目からオーバーライトしてしまっている感じ)

 上記の評価コードは以下

// 連結元の文字列
private static StringBuilder _a;
private static StringBuilder _b;
// 連結後の文字列
private static StringBuilder _concat;

// スレッドA側のAppend
static void append_a()
{
    _concat.Append(_a);
}

// スレッドB側のAppend
static void append_b()
{
    _concat.Append(_b);
}

static void Main(string[] args)
{
    const int L = 10000;

    // 準備:Append 元の文字列を作る
    _a = new StringBuilder();
    _b = new StringBuilder();

    for (var i = 0; i < L; i+=1)
    {
        _a.Append("O");
        _b.Append(".");
    }


    // ここからテスト
    var count = 0;

    while (true)
    {
        _concat = new StringBuilder();

        // スレッドを作って起動
        var thread_a = new System.Threading.Thread(append_a);
        var thread_b = new System.Threading.Thread(append_b);

        thread_a.Start();
        thread_b.Start();

        // スレッドの終了を待つ
        thread_a.Join();
        thread_b.Join();

        // 評価
        count += 1;
        if (_concat.Length != L * 2) // 文字数 L 同士の結合なので、期待する文字数は L*2
        {
            Console.WriteLine("{0} 回目に失敗",count.ToString());
            Console.WriteLine("結果の文字列長   : {0}", _concat.Length);
            Console.WriteLine("結果の先頭50文字 : {0}", _concat.ToString().Substring(1, 50));
            return;
        }
        
    }
}





カテゴリー: C#, Program

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org