2009-10-06 2 views
2

HttpApplicationState가 동시 액세스를 관리하는 기능이 AcquireRead()/AcquireWrite() 인 방법을 설명하는 기사를 읽었습니다. 어떤 조건에서는 레이스 조건을 피하기 위해 응용 프로그램 개체에 Lock()Unlock() 설명을 사용해야한다고 설명하고 있습니다.HttpApplicationState - 스레드 안전성이 있으면 Race 조건이 존재하는 이유는 무엇입니까?

동시 액세스가 암시 적으로 개체에 의해 처리되는 경우 응용 프로그램 상태에 대한 경쟁 조건이 있어야하는 이유를 이해할 수 없습니다.

누군가 나에게 설명해 주시겠습니까? 내가 Application.Lock()Application.Unlock()을 사용해야하는 이유는 무엇입니까? 고맙습니다 !

답변

3

AcquireRead 및 AcquireWrite 메서드는 내부 HttpApplicationStateLock 클래스에 있으므로 사용자가 직접 사용하지 마십시오. 이들은 액세스를 동기화하지만 단일 읽기 또는 쓰기에만 해당됩니다. 코드에서 액세스를 동기화해야하는 경우 잠금 및 잠금 해제 방법을 사용합니다.

하나의 읽기 또는 쓰기가 아닌 다른 응용 프로그램 항목을 추가하거나 항목이 있는지 먼저 확인한 다음 추가하는 것과 같이 일반적으로 액세스를 동기화해야합니다.

세계적으로 액세스 변수에 그 응용 프로그램을 사용하는 모든

사용자가 볼 수 있습니다 -

Application.Lock() 
if (Application["info"] == null) { 
    Application.Add("info", FetchInfoFromDatabase()); 
} 
Application.Unlock(); 
+0

그것은이다 혼란 스럽다. 어떤 종류의 스레드 안전 Microsoft가이 경우에 해당합니까? 'ReaderWriterLock'는 쓰기 연산 ('Add','Set'을 사용)이 수행 될 때 상황을 처리하지 않아야하며, 다른 스레드는 읽을 수 없어야합니다 (잘못된 데이터가 독자에게 제공되는 상황을 보장)? 나는 틀릴 수도 있지만 그러한 상황을 생각할 수는 없습니다. 예제를 제공해 주시겠습니까? – Learner

+1

@CSharpLearner : 위 예에서 읽기 및 쓰기가 있습니다. 각각은 자체적으로 보호되지만 다른 스레드가 쓰기를 수행하기 전에 두 스레드가 서로간에 읽을 수 있습니다. 둘 다 데이터를 가져 와서 추가하려고합니다. – Guffa

+0

감사합니다. 나는 뭔가 다른 것을 생각하고 있었다. 'ReaderWriterLock'에서 한 번에 하나의 쓰레드 만 쓰고 다른 쓰레드는 읽거나 쓰지 못하도록 막을 수 있습니다. 옳은? 따라서 동일한 코드를 사용하는 병렬 스레드는 첫 번째 스레드가 쓰기를 완료 할 때까지 대기합니다. 첫 번째 스레드가 완료되면 다른 스레드의 쓰기 작업이 다시 시작됩니다. 내가 맞습니까? 이 경우 그림에서'FetchInfoFromDatabase()'가 무겁지 않고 시간이 오래 걸리면 명확한 잠금/잠금 해제가 중요할까요? – Learner

1

HttpApplicationState. 따라서 변경하는 동안 경쟁 조건을 피하기 위해

변수의 값. 우리는 몇 가지 예방이 필요, 우리는

Application.Lock을 (사용하는 이유를 먹으 렴) 및 사용

큐에 Application.Unlock을 다른 사람에게 같은 변수를 해제 할 작업() 이후

Application.Lock() 
Application("VisitorCount") = Convert.ToInt32(Application("VisitorCount")) + 1 
Application.UnLock() 
관련 문제