여유 시간에 동시성을 가지고 놀고, 판독기 쪽에서 잠금을 사용하지 않고 찢어진 읽기를 시도하여 동시 판독기가 서로 간섭하지 않도록하려고했습니다.C#/CLR : MemoryBarrier 및 찢어진 읽기
아이디어는 잠금을 통해 쓰기를 직렬화하지만 읽기 측면에서는 메모리 배리어만을 사용하는 것입니다. 여기에 내가 해낸 방법 캡슐화 재사용 가능한 추상화입니다 :
public struct Sync<T>
where T : struct
{
object write;
T value;
int version; // incremented with each write
public static Sync<T> Create()
{
return new Sync<T> { write = new object() };
}
public T Read()
{
// if version after read == version before read, no concurrent write
T x;
int old;
do
{
// loop until version number is even = no write in progress
do
{
old = version;
if (0 == (old & 0x01)) break;
Thread.MemoryBarrier();
} while (true);
x = value;
// barrier ensures read of 'version' avoids cached value
Thread.MemoryBarrier();
} while (version != old);
return x;
}
public void Write(T value)
{
// locks are full barriers
lock (write)
{
++version; // ++version odd: write in progress
this.value = value;
// ensure writes complete before last increment
Thread.MemoryBarrier();
++version; // ++version even: write complete
}
}
}
이 버전 변수에 오버 플로우에 대해 걱정하지 마십시오을, 나는 다른 방법 피하기. 그래서 내 이해와 Thread.MemoryBarrier의 응용 위의 올바른 무엇입니까? 장벽이 불필요한가요?
귀하의 의견과 코드 (정보/버전)가 맞지 않습니다. –
감사합니다. 수정 사항 게시! – naasking