728x90
※개념만 알아둘것
메모리 베리어 (Rock처리안할 경우)
멀티스레드 환경에서 메모리순서가 강제로 변경된다. 이때 메모리 순서 변경을 막기위한 방법
1. 코드 재배치 억제
1) Full Memory Barrier(어셈블리 MFENCE, C# Thread.MemoryBarrier) - Store/Load 둘다 막는다.
2) Store Memory Barrier(어셈블리 SFENCE - Store 막는다)
3) Load Memory Barrier(어셈블리 LFENCE - Load 막는다)
2. 가시성
static int x = 0;
static int y = 0;
static int r1 = 0;
static int r2 = 0;
static void Thread_1()
{
y = 1;
//Thread.MemoryBarrier(); 메모리베리어 사용시 메모리의 순서가 변하지 않는다.
r1 = x;
}
static void Thread_2()
{
x = 1;
//Thread.MemoryBarrier(); 메모리베리어 사용시 메모리의 순서가 변하지 않는다.
r2 = y;
}
static void Main(string[] args)
{
int count = 0;
while (true)
{
count++;
x = y = r1 = r2 = 0;
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
if(r1==0 && r2 == 0)
{
break;
}
}
Console.WriteLine(count);
}
728x90
'VisualStudio > C#서버' 카테고리의 다른 글
[C#서버][개념] 임계영역 Spin락(스핀락(SpinLock)) (0) | 2022.10.26 |
---|---|
[C#서버][개념] 임계영역(크리티컬섹션)원자성 - 레이스컨디션(Race Condition)과 Interlocked (0) | 2022.10.26 |
[C#서버][개념] volatile을 사용해 어셈블리 최적화 막기 (0) | 2022.10.26 |
[C#서버][기초] Thread & ThreadPool & Task (0) | 2022.10.26 |
[C#서버][기초] Thread 테스트 방법 (0) | 2022.10.26 |