2011-02-11 5 views
0

작은 혼란이 있습니다. 별도로 잠금 장치를 사용할 때의 고려 사항

private static bool status; 

public static bool Status 
{ 
    get { return status; } 
    set { status = value; } 
} 

지금은 시작이 개 스레드를 다음과 첫 번째 스레드가 변수 상태와 같은 참/거짓 두 번째 스레드 속성을 사용하여 값을 설정하여 값을 가져옵니다으로 나는 C#에서 속성 상태라는 하나 개의 정적 변수를 사용하고 있습니다 변수 상태에 대한 속성. 이 시나리오에서는 다음

, 내가 첫 번째 스레드가 두 번째 스레드가 내가 잠금 문을 사용할 필요 여부 변수 상태

의 값을 읽으려고 동안 변수 상태의 값을 업데이트하려고하면
을 무슨 일이 일어날 지처럼 생각 속성 내의이 변수 상태가 스레드 동기화를 처리 할 필요가 없습니까? 누구나이 의심을 분명히함으로써 나를 도울 수 있습니까?

+0

가능한 복제본 [C#에서 변수에 액세스하고 있습니까?] (http://stackoverflow.com/questions/9666/is-accessing-a-variable-in-c-an-atomic-operation) –

+0

나는이 C# .net 환경에 익숙하지 않다. 나는 그 링크를 보았고 매우 높은 수준처럼 보였다. 나는 명확하게 이해할 수 없다. 결론을 내리고 잠금 선언문을 사용해야하는지 말해 주시겠습니까? – Senthil

+0

이 특별한 경우 읽기/쓰기 작업은 실제로 원자력 작업이므로 읽고 잠글 필요가 있다고 생각하지 않습니다. 분명히 이것은 모든 속성에 적용되지 않습니다 –

답변

0

내부 동기화는 잠금이 해당 리소스를 사용하는 코드 블록에서 공유 리소스에 대한 액세스를 차단하기 때문에 아무 것도 달성하지 않습니다.

동기화가 필요한 것은 속성에 액세스하는 전체 블록입니다. 일반적으로 호출자 레벨에서 액세스를 동기화해야합니다.

void Thread1() { 
    lock(myObj) { 

     if(myObj.Status) 
      Console.WriteLine("Status is true"); 

     // ... 

     // myObj.Status is guaranteed to be still true as long as 
     // all the code that accesses the property lock myObj. 
     if(myObj.Status) 
      Console.WriteLine("Status is still true"); 

    } 
} 

속성이있는 개체를 잠글 필요가 없습니다. 모든 관련 스레드간에 공유되는 한 다른 개체를 동기화 메커니즘으로 사용할 수 있습니다. 귀하의 질문에서

static object mutex = new object(); 

void Thread1() { 
    lock(mutex) { 

     if(myObj.Status) 
      Console.WriteLine("Status is true"); 

     // ... 

     // myObj.Status is guaranteed to be still true as long as 
     // all the code that accesses the property lock myObj. 
     if(myObj.Status) 
      Console.WriteLine("Status is still true"); 

    } 
} 
+0

좋은 설명을 주신 데 고마워요. – Senthil

1

나는 스레드 하나가에 따라 몇 가지 작업을 상태 값을 생성하고 가치를이 개 소비하는 스레드와 않습니다 이해합니다. 여기에는 원시 타입을 읽는 것이 (다른 쓰레드가 손상되지 않는 데이터를 읽는 동안) 쓰레드 안전하기 때문에 잠금이 필요 없다. 잠금은 데이터를 쓰려는 작성자 스레드가 두 개 이상인 경우에만 필요합니다. 예를 들어 두 스레드가 상태 값을 설정하려고하면 잠금 블록이 필요합니다.