2011-07-26 11 views
0

クラスのインスタンスを作成し、そのメソッドを使用してスレッドの整合性を開始するとき、スレッドの安全性はあまり重要ではありませんか?スレッドの安全性はいつ問題になりますか?

+0

何オブジェクトの種類は情報ですか? –

+0

編集編集をご覧ください。 –

+0

これが役立つかどうかわからないが、私がここに投稿した答えをチェックアウトする:http://stackoverflow.com/questions/5187568/delays-when-reading-process-output-asynchronously/5187715#5187715 –

答えて

0

複数のスレッドが同じオブジェクトインスタンスにアクセスしている場合は、あなたがスレッドの安全性を確保するためにロックを追加する必要があります:サイドノートとして

// make sure that this is defined *outside* the method 
// so that all threads lock on the same instance 
private readonly object _lock = new object(); 

... 

// add a lock inside your event handler 
proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) => 
{ 
    if (e.Data != null) 
    { 
     lock (_lock) 
      info.additional += e.Data; 
    } 
}; 

、あなたは.NET 4を使用している場合は、あなたがチェックしたい場合がありますConcurrentQueueクラス。別のスレッドでアイテムをデキューするには

private ConcurrentQueue<SomeInfo> _queue = new ConcurrentQueue<SomeInfo>(); 

... 

proc.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) => 
{ 
    if (e.Data != null) 
    { 
     // no need to lock 
     _queue.Enqueue(e.Data); 
    } 
}; 

、あなたが使用します:それは、複数のスレッドが同時にそのアイテムをキューに入れる必要がある場合に役立つことができFIFOバッファのスレッドセーフな実装だ

SomeData data = null; 
while (_queue.TryDequeue(out data)) 
{ 
    // do something with data 
} 
+0

複数のスレッドがアクセスしていない同じオブジェクト。各スレッドのプロセスを開始するクラスのインスタンスを作成します。 –

+0

キューは問題ではありません。私が信じている出力リダイレクションです。 –

+0

@Joey:これをイベントハンドラに追加します: 'Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);'。私はあなたがコンソールに書き込まれた別のスレッドIDを取得する必要がありますと信じています。 – Groo