2009-02-07 7 views
3

UI 스레드가 네트워크 통신을 수행하는 백그라운드 스레드와 통신해야하는 코드를 작성 중입니다. 코드는 작동하지만 스레드 안전하다고 간주됩니까? 사람이의 오른쪽 경로로 나를에 이어질 수있는 경험이 있다면 내가 더 많이 느낄 것이 코드는 스레드 안전합니까?

...

static Mutex^ mut_currentPage = gcnew Mutex; 
static array<unsigned char>^ m_currentPage; 

property array<unsigned char>^ Write 
{ 
    void set(array<unsigned char>^ value) 
    { 
     mut_currentPage->WaitOne(); 
     m_currentPage = value; 
     mut_currentPage->ReleaseMutex(); 
    } 
} 

이 .NET의 C++ 코드 ... :)

답변

4

이것은 스레드 안전성이 있지만 예외 처리에 대해 생각하고 싶을 수 있습니다. 필드를 설정하면 오류가 발생하지 않습니다 (아마도 ThreadAbortException 제외). 그러나 코드가 더 복잡한 경우에는 예외가 발생하면 뮤텍스를 해제해야합니다.

나는 또한

또 다른 생각 (C#에서 "잠금") Monitor보고 싶은데 : 당신이 필드 액세스를 잠글 경우에도이 배열은 본질적으로 변경할 수 있습니다. 대신 불변이므로 string을 사용해보십시오.

+0

예외 안전성 : 저는 Mutex의 MSDN 텍스트 북 예제가 RAII를 통한 잠금 기능을 도입하지 않는다고 실제로 놀랍습니다. 이것은 10 년 후의 단계와 같습니다. – gimpf

3

당신의 경우 프로세스 내에서 스레드를 사용하고 뮤텍스 대신 Monitor를 사용하면 상호 배타를 원할뿐입니다. 더 효율적입니다.

괜찮아 보이는군요. 값이 일 때 잠금을 설정해야합니다. 그렇지 않으면 아무 것도 그럴 필요가 없습니다. 다른 대안은 변수를 휘발성으로 만드는 것입니다 (적어도 C#에서는 C++/CLI에서 해당 함수가 무엇인지 알 수 없습니다).

관련 문제