2011-12-17 4 views
1

한 스레드 (thread2)에서 값을 변경했습니다.부울 값을 두 스레드간에 동기화 유지

CheckSuccess = false; 

이제 메인 스레드 (thread1 - GUI/양식)하지 픽업 변화는, 어떻게 모든 스레드 주위에 "전달 될"변경 가능한 것입니까?

나는 스레드 그것은 Race Condition처럼 보인다

+2

[휘발성]으로 표시되어 있습니까 (http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx)? – oleksii

+0

주 스레드가 적극적으로 부울을 모니터링합니까 아니면 변경된 것을 어떻게 든 인식합니까? – Dykam

+0

backgroundworker는이를 처리하기 위해 Completed 및 ProgressChanged 이벤트를 제공합니다. –

답변

2

, 데이터를 조작 (그렇게 말하지 않는 한) 별도의 인스턴스에서 작동하지 말아야 인상이었다. 이것을 피하려면 공유 변수에 대한 액세스를 동기화해야합니다.

  • CheckSuccess가 필드 인 경우 - volatile 키워드로 표시해보십시오.
  • CheckSuccess 만약 당신이 lock() statement을 사용할 수 있습니다 (메서드 호출로 변환됩니다) 속성입니다 : UI 컨트롤의 속성입니다

    private static readonly object stateLock = new object(); 
    lock (stateLock) 
    { 
        // access a shared variable here 
        CheckSuccess = false; 
    } 
    
  • CheckSuccess 경우 당신은 작업자 스레드에서 변경하려는 - WPF의 WinForms를 사용하고있는 프레임 워크에 따라 특별한 기술을 사용하여 변경 사항을 작업자에서 UI 스레드로 푸시해야합니다.

PS : 당신이 쓰는 값을 읽는 여러 스레드와 몇 스레드가있는 경우은 또한 (기본적으로 쓰기보다 더 자주 읽고) 유용 할 수 있습니다. ReaderWriterLock

+0

원자 값을 작성하기 때문에 경쟁 조건이 해결되지 않습니다. . 실행 순서가 잘못되었습니다. – Dykam

+0

@Dykam : CheckSuccess가 메소드 호출로 변환 된 속성이지만이 필드에 대해 잘못된 이름을 지정했는지 분명히 할 필요가 있다고 생각합니다. – sll

+0

실제로이 경우. – Dykam

0

아니요 예 : Exchange과 같은 인터 로킹 된 방법을 사용하십시오. 이것은 잠금 객체를 사용하는 것보다 훨씬 간단하며 원자적일 수 있습니다.

0

문제는 대부분 CPU 레지스터에서 부울 값 캐싱을 일으키는 컴파일러 최적화입니다. volatile으로 신고하면 문제를 해결할 수 있습니다.

관련 문제