어떤 스레드가 동기화 요소를 소유한 채로 해제하지 않으면 동일한 동기화 요소를 대기하던 스레드는 영원히 블로킹될 수 있다.
유저 모드 동기화 요소인 경우 라이브락(LiveLock)
커널 모드 동기화 요소인 경우 데드락(DeadLock)
둘 다 좋지 않지만 그래도 라이브락이 더 안 좋다. 데드락은 메모리만을 허비하지만 라이브락은 CPU, 메모리 둘 다 허비하기 때문
유저 모드 동기화
일반적으로 데이터를 읽고 쓰는 과정은 원자적(atomic)으로써, 한 번에 읽고 쓰는 것이 보장된다.하지만 데이터에 따라 앞부분, 뒷부분으로 나뉠 경우 쪼개어진 읽기(torn read)가 발생할 수 있다. Int64 예로 앞부분, 뒷부분 Int값이 쓰여지는 경우
l Volatile 동기화 요소
단순 데이터 타입의 변수에 대하여 지정된 시간에 원자적으로 변수의 값을 읽고 쓸 수 있도록 해준다.
System.Threading.Volatile
C#, JIT, CPU가 일부 최적화 기법을 적용하지 못하게 한다.
예를 들어 int value = 3 – 3; 이런 식의 코드를 바로 계산을 해버려 for 구문에 적용하는 경우가 최적화 기법이라 하는데 이런 식이면, 다중 스레드 환경에서 다른 곳에서 미리 계산이 최적화 되는 경우가 발생해 원치 않은 값이 나올 수 있다.
Volatile.Write
호출한 위치에서 그 값이 반드시 쓰여질 것임을 보장.
순서상 코드를 호출한 위치보다 앞쪽에서 수행된 로드(load)/스토어(store) 과정은 반드시 이 코드보다 앞서 수행 보장.
Volatile.Read
호출한 위치에서 그 값이 읽혀질 것임을 보장
순서상 코드 이후에 위치한 로드(load)/스토어(store) 과정은 반드시 이 메서드 수행된 이후에 수행될 것을 보장
l Interlocked 동기화 요소
단순 데이터 타입의 변수에 대하여 지정된 시간에 원자적으로 변수의 값을 읽고 쓸 수 있도록 해준다.
메모리 펜스(memory fence)기능 제공
항상 쓰기 작업은 Interlock 이전에 하고, 읽기 작업은 Interlock 이후에 한다.
'C# > CLR via' 카테고리의 다른 글
단순 스레드 동기화 (1) | 2020.03.25 |
---|---|
I/O 중심의 비동기작업 (1) | 2020.03.25 |
LINQ (0) | 2020.03.25 |
스레드(Thread) (0) | 2020.03.25 |
직렬화 serialization (0) | 2020.03.25 |