2011-07-26 5 views
0

스레드 안전성은 클래스를 인스턴스화하고 해당 메소드를 사용하여 스레드 수정을 시작할 때 그렇게 중요하지 않습니까? 여러 스레드가 같은 개체 인스턴스에 액세스하는 경우스레드 안전성은 언제 문제가됩니까?

+0

무엇 오브젝트의 종류는 정보인가? –

+0

수정 사항을 참조하십시오. –

+0

이것이 도움이 될지 확실하지 않지만 여기에 게시 된 답변을 확인하십시오. http://stackoverflow.com/questions/5187568/delays-when-reading-process-output-asynchronously/5187715#5187715 –

답변

0

는, 당신은 스레드 안전을 보장하기 위해 잠금 추가해야합니다 : 당신은 .NET 4를 사용하는 경우 보조 노트로

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

을, 당신은 확인 할 수 있습니다 ConcurrentQueue 클래스 그것은 여러 스레드가 동시에 자신의 항목을 대기열해야하는 경우 유용 할 수있는 FIFO 버퍼의 스레드 안전 구현의 :

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

을 별도의 스레드에서 항목을 큐에서 제거하려면 다음을 사용 :

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

관련 문제