Async 동기화 기원 구축, Part 6 AsyncLock
요즘 공부하고 있어요.NET4.5 병렬 작업의 사용에 관하여.'병렬 작업' 은 이전 버전과 유사한 동기화 메커니즘을 보여 주지 않습니다. 이벤트 대기 핸들, 신호량, lock, Reader Writer Lock... 등 동기화 기원 대상을 보여 주지 않지만, 우리는 시내를 따라 프로그래밍 습관을 나타낼 수 있습니다. 그러면 이 일련의 번역은 '병렬 작업' 에 동기화 기원 대상을 봉인하는 것입니다.번역 리소스 Async 및 Await에 대한 FAQ
1. Async 동기화 기원 구축, Part 1 AsyncManualResetEvent
2. Async 동기화 기원 구축, Part 2 AsyncAutoResetEvent
3. Async 동기화 기원 구축, Part 3 AsyncCountdown Event
4. Async 동기화 기원 구축, Part 4 AsyncBarrier
5. Async 동기화 기원 구축, Part 5 AsyncSemaphore
6. Async 동기화 기원 구축, Part 6 AsyncLock
7. Async 동기화 기원 구축, Part 7 AsyncReader WriterLock
원본: Async 동기화 기원을 구축합니다.rar
시작: Async 동기화 기원 구축, Part 6 AsyncLock
최근에 우리는 AsyncSemphore를 구축했는데, 지금은 using 블록에서 비동기적인 배척 메커니즘을 지원하는 유형을 구축합니다.
앞에서 말한 바와 같이 신호량은 흐름 제한과 자원 접근 관리에 매우 적합하다.너는 신호량에 초기 계수를 주고 지정된 수량의 소비자만 신호를 성공적으로 받을 수 있도록 하며, 자원이 방출될 때까지 내부 신호 계수가 0보다 많을 때까지 여분의 요청을 강요할 수 있다.신호량은 특정 코드 영역에 정확하게 들어가는 것을 보호할 수 있고 내부 계수는 1로 설정할 수 있다.이런 방식을 통해 너는 신호량을 사용하여 서로 배척하는 목적을 달성할 수 있다. 예를 들어 다음과 같다.
private readonly AsyncSemaphore m_lock = new AsyncSemaphore(1);
…
await m_lock.WaitAsync();
try
{
… // protected code here
}
finally
{
m_lock.Release();
}
AsyncLock 형식을 만들어서 using 키워드를 사용하여 인코딩을 간소화할 수 있습니다.우리의 목적은 위 부분과 일치하지만 다음과 같은 코드를 통해 실현한다.
private readonly AsyncLock m_lock = new AsyncLock();
…
using(var releaser = await m_lock.LockAsync())
{
… // protected code here
}
이러한 효과를 얻기 위해 다음과 같은 유형을 구축할 것입니다.
public class AsyncLock
{
public AsyncLock();
public Task LockAsync();
public struct Releaser : IDisposable
{
public void Dispose();
}
}
내부에서 우리는 두 명의 구성원을 유지할 것이다.우리는 AsyncSemaphore 대상을 사용하여 대부분의 논리를 처리하는데 m 를 사용한다releaser 변수 캐시의 Task 인스턴스는 액세스 잠금이 경쟁적이지 않을 경우 불필요한 할당을 피하기 위해 직접 반환됩니다.
private readonly AsyncSemaphore m_semaphore;
private readonly Task m_releaser;
Releaser 구조는 IDisposable 인터페이스를 구현한 Dispose () 방법일 뿐, 이 방법은 밑바닥의 신호량을 방출한다.이것은 using 블록에서 Releaser 구조를 사용할 수 있도록 하는 이유입니다. using에서 자동으로 생성된finally 블록은 디스패치 () 방법, 즉 Seamphore 실례의Release () 방법을 호출해서 방출합니다.
public struct Releaser : IDisposable
{
private readonly AsyncLock m_toRelease;
internal Releaser(AsyncLock toRelease)
{
m_toRelease = toRelease;
}
public void Dispose()
{
if (m_toRelease != null)
m_toRelease.m_semaphore.Release();
}
}
AsyncLock의 구조 함수는 구성원을 초기화하는 것일 뿐입니다. 값이 1인 매개 변수를 사용하여Semaphore를 만들고 캐시된Task를 만듭니다.
public AsyncLock()
{
m_semaphore = new AsyncSemaphore(1);
m_releaser = Task.FromResult(new Releaser(this));
}
마지막으로 LockAsync 방법을 구축합니다.우리는 우선 Semaphore의 Waitasync () 를 호출해서 우리가 얻은 자물쇠를 가리키는 Task를 얻었습니다.Task가 완료되면 캐시된 Task를 동기화하여 반환하므로 경쟁업체 잠금 해제 시 할당할 필요가 없습니다.Task 가 완료되지 않은 경우 Task 의 지속 작업이 반환됩니다.
public Task LockAsync()
{
var wait = m_semaphore.WaitAsync();
return wait.IsCompleted ?
m_releaser :
wait.ContinueWith((_,state) => new Releaser((AsyncLock)state),
this, CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
이것이 바로 이 절에서 말하고자 하는 AsyncLock이다.
전체 소스는 다음과 같습니다.
public class AsyncLock
{
private readonly AsyncSemaphore m_semaphore;
// Task , , 。
private readonly Task m_releaser;
public AsyncLock()
{
// 1,
m_semaphore = new AsyncSemaphore(1);
m_releaser = Task.FromResult(new Releaser(this));
}
public Task LockAsync()
{
var wait = m_semaphore.WaitAsync();
return wait.IsCompleted ?
m_releaser :
wait.ContinueWith((_, state) => new Releaser((AsyncLock)state)
, this, CancellationToken.None
, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
public struct Releaser : IDisposable
{
private readonly AsyncLock m_toRelease;
internal Releaser(AsyncLock toRelease)
{
m_toRelease = toRelease;
}
// using finally IDisposable Dispose()
public void Dispose()
{
if (m_toRelease != null)
m_toRelease.m_semaphore.Release();
}
}
}
///
///
///
public class AsyncLock_Test
{
private readonly AsyncLock m_lock = new AsyncLock();
public async void Test()
{
using (var releaser = await m_lock.LockAsync())
{
//
}
}
}
다음 절에서는 비동기 버전의read/writer 자물쇠를 실현할 것입니다.
권장 읽기:
비동기 프로그래밍: 동기화 기원 대상 (위)
비동기 프로그래밍: 동기화 기원 대상 (하)
시청해 주셔서 감사합니다..
원문: Building Async Coordination Primitives, Part 6: AsyncLock
작성자: Stephen Toub – MSFT
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.