2014-12-19 2 views
1

메모장에 빨리 작성 했으므로 오류가 있으면 사과드립니다.참 고 스레드 안전

알파와 베타의 두 클래스가 있습니다. Alpha는 스레드 안전 작업 만 노출합니다. 베타는 다른 스레드에서 이러한 작업에 액세스합니다. 이 스레드는 안전한가요?

알파의 참조를 Beta 스레드에 안전하게 전달하고 있습니까?

예 :

public class Alpha 
{ 
    readonly private object key = new object(); 
    private int _notThreadSafe = 0; 
    public int ThreadSafeProperty 
    { 
     set 
     { 
      lock(key) 
      { 
       _notThreadSafe = value; 
      } 
     } 
     get 
     { 
      int temp; 
      lock(key) 
      { 
       temp = _notThreadSafe; 
       return temp; 
      } 
     } 
    } 

    public Alpha() 
    { 
     Thread ClientThread = new Thread(delegate() 
     { 
      new Beta(this); 
     }); 
     ClientThread.Start(); 
    } 

    public class Beta 
    { 
     public Beta(Alpha ParentClass) 
     { 
      if(ParentClass != null) 
      { 
       ParentClass.ThreadSafeProperty = 1; 
      } 
     } 
    } 
} 
+0

A'는 스레드 안전이 될 수 있다는 것을 의미 있어야하는데 '하는 경우 다른 스레드가 안전하게 액세스 할 수 있습니다. 그래서 당신은 다른 스레드에서 쓰레드 안전 코드에 접근 할 때 어떤 일이 일어나는가하는 질문에 답할 수 있을까요? 안전하게 액세스 할 수 있습니다. – DLeh

답변

1

귀하가 네, 읽고 그건 당신이 스레드 안전을 위해 필요하다면, 원자 될 것 ThreadSafeProperty에 기록합니다. 실제 사용량이 이와 같이 간단하다면 lockInterlocked.Exchange()으로 대체하는 것이 좋습니다.

+0

ParentClass에서 null을 확인하는 것은 어떻습니까? 그게 쓰레드 안전인가요? –

+0

@NathanSurfus 다른 스레드는 로컬 변수'ParentClass'의 수정으로 인해 수정되거나 영향을받지 않습니다. (참고로 변수가 가리키는 객체가 아니라 변수 자체를 취하고 있습니다.) 그렇기 때문에 스레드로부터 안전합니다. –

0

예. 상황이 "덮개 아래에서"바뀔 때 약간 혼란스러워 보입니다.

  1. ParentClass는 스레드 초기화 프로그램에서 전달한 다음 변경되지 않은 로컬 변수입니다. 그것은 (ParentClass) 스레드로부터 안전합니다 알파에 대한 참조를 보유하고 있습니다. 따라서 ParentClass에 대한 액세스는 안전합니다.

  2. 작성한대로 lock 문은 사용자에게 추가적인 안전을 부여하지 않습니다. _notThreadSafe = value와 같은 .net 변수 설정자는 원자 단위로 보장됩니다. 즉, 정수가 4 바이트 인 경우, 예를 들어 다음과 같이 읽을 수 없습니다. 2 바이트는 이전 값의 값이고 2 바이트는 새 값의 값입니다. 당신의 getter/setter를 더 복잡하게하지 않는 한 따라서, 당신은 잠금 장치의 제거 얻을 수 있습니다, 그냥 쓰기 :

    public int ThreadSafeProperty { get; set; }