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; } } }