후드 아래에서 잠금 문은 무엇을 합니까?
스레드 세이프가 아닌 객체를 사용하는 경우 다음과 같은 잠금 장치로 코드를 감싼다는 것을 알 수 있습니다.
private static readonly Object obj = new Object();
lock (obj)
{
// thread unsafe code
}
따라서 여러 스레드가 동일한 코드에 액세스할 때 발생하는 현상(ASP에서 실행되고 있다고 가정합니다).NET 웹 애플리케이션).줄 서 있나요?그렇다면 그들은 얼마나 기다려야 합니까?
잠금 장치를 사용하면 성능에 어떤 영향을 미칩니까?
그lock
문장은 C# 3.0에 의해 다음으로 번역됩니다.
var temp = obj;
Monitor.Enter(temp);
try
{
// body
}
finally
{
Monitor.Exit(temp);
}
C# 4.0에서는 이 값이 변경되었으며 현재 다음과 같이 생성됩니다.
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
// body
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
다음 항목에 대한 자세한 정보를 확인할 수 있습니다.Monitor.Enter
여기서 합니다.MSDN 인용하기
사용하다
Enter
매개 변수로 전달된 개체에 대한 모니터를 획득합니다.다른 스레드가 실행된 경우Enter
대상에 있지만 아직 해당 항목을 실행하지 않았습니다.Exit
다른 스레드가 개체를 해제할 때까지 현재 스레드가 차단됩니다.동일한 스레드가 호출되는 것은 합법적입니다.Enter
차단하지 않고 두 번 이상; 그러나 동일한 수의Exit
개체에서 대기 중인 다른 스레드의 차단이 해제되기 전에 호출해야 합니다.
그Monitor.Enter
메서드가 무제한으로 대기하며 시간이 초과되지 않습니다.
생각보다 간단하네요
Microsoft에 따르면:그lock
키워드를 사용하면 다른 스레드가 중요 섹션에 있는 동안 한 스레드가 코드의 중요 섹션에 들어가지 않습니다.다른 스레드가 잠긴 코드를 입력하려고 하면 개체가 해제될 때까지 대기하고 차단합니다.
그lock
키워드는 블록의 시작과 끝에 호출됩니다. lock
키워드는 실제로 백엔드에서 클래스를 처리합니다.
예:
private static readonly Object obj = new Object();
lock (obj)
{
// critical section
}
위의 코드에서 스레드는 먼저 임계 섹션으로 들어간 다음 잠깁니다.obj
다른 스레드가 들어가려고 하면 잠금도 시도합니다.obj
첫 번째 스레드에 의해 이미 잠겨 있습니다.두 번째 스레드는 첫 번째 스레드가 해제될 때까지 기다려야 합니다.obj
첫 번째 스레드가 떠나면 다른 스레드가 잠깁니다.obj
중요한 섹션으로 들어갑니다.
아니요, 대기열에 있는 것이 아니라 자고 있는 중입니다.
양식의 잠금 문
lock (x) ...
여기서 x는 기준 유형의 표현이며, 정확하게는 다음과 같습니다.
var temp = x;
System.Threading.Monitor.Enter(temp);
try { ... }
finally { System.Threading.Monitor.Exit(temp); }
서로 기다리고 있다는 것만 알면 됩니다. 스레드 하나만 들어가서 블록을 잠그고 다른 스레드들은 기다립니다.
모니터는 .net에 완전히 기록되어 있으므로 충분히 빠릅니다. 자세한 내용은 반사판이 있는 클래스 모니터도 참조하십시오.
잠금은 다른 스레드가 잠금 블록에 포함된 코드를 실행하지 못하도록 차단합니다.스레드는 잠금 블록 내부의 스레드가 완료되고 잠금이 해제될 때까지 기다려야 합니다.이는 멀티스레드 환경에서 성능에 부정적인 영향을 미칩니다.이 작업을 수행해야 하는 경우 잠금 블록 내의 코드가 매우 빠르게 처리될 수 있는지 확인해야 합니다.당신은 데이터베이스 접근 등과 같은 값비싼 활동을 피하도록 노력해야 합니다.
성능에 미치는 영향은 잠금 방식에 따라 달라집니다.최적화 목록은 여기에서 찾을 수 있습니다. http://www.thinkingparallel.com/2007/07/31/10-ways-to-reduce-lock-contention-in-threaded-programs/
기본적으로 대기 코드를 절전 모드로 전환하므로 가능한 한 적게 잠그도록 해야 합니다.잠금 장치에 계산량이 많거나 오래 지속되는 코드(예: 파일 업로드)가 있으면 성능이 크게 저하됩니다.
lock 문 내의 부품은 하나의 스레드에서만 실행될 수 있으므로 다른 모든 스레드는 잠금을 보유한 스레드가 완료될 때까지 무한정 기다립니다.이로 인해 소위 교착 상태가 발생할 수 있습니다.
그lock
은 진은전 ▁로 전화하는 됩니다.Enter
그리고.Exit
방법
그lock
문은 잠금 개체가 해제될 때까지 무한정 기다립니다.
Microsoft의 MSDN에 따르면 잠금은 다음과 같습니다.
object __lockObj = x;
bool __lockWasTaken = false;
try
{
System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
// Your code...
}
finally
{
if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}
런타임에 잠금을 만들어야 하는 경우 오픈 소스 DynaLock을 사용할 수 있습니다.런타임에 새 잠금을 만들고 컨텍스트 개념을 사용하여 잠금의 경계를 지정할 수 있습니다.
DynaLock은 오픈 소스이며 소스 코드는 GitHub에서 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6029804/what-does-a-lock-statement-do-under-the-hood
'source' 카테고리의 다른 글
Visual Studio에서 WPF Initialize Component 메서드를 찾을 수 없는 이유는 무엇입니까? (0) | 2023.05.05 |
---|---|
"작업이 트랜잭션 상태에 대해 유효하지 않습니다." 오류 및 트랜잭션 범위 (0) | 2023.05.05 |
psql: 서버에 연결할 수 없습니다.해당 파일 또는 디렉터리 없음(Mac OS X) (0) | 2023.05.05 |
.NET WPF 세션 간 창 크기 기억 (0) | 2023.05.05 |
모든 디렉토리 및 파일을 재귀적으로 복사하려면 어떻게 해야 합니까? (0) | 2023.04.25 |