Interlocked는 정수만 제어가능하다는 단점이 있다.
- 구문을 Atomic하게 제어할 수 있는 무언가가 필요하다.
Monitor를 이용한 Atomic구현
- 빈 object를 기준으로 Atomic영역의 시작과 끝을 정의할 수 있음.
하지만 코드가 길어질 경우 실수로 return을 하여 Monitor.Exit가 실행이 안되면 프로그램이 멈춰버림
- Thread_1은 return이후에 정상적으로 실행이 되겠지만, Thread_2의 경우 Thread_1에 의해 잠겨버린 _obj에 의해 동작이 멈춰버리게 된다.
- Thread_2는 Dead Lock 상태(죽은 자물쇠)
- 문을 잠그고 안열어준 상태
해결책1.
try - finally
- 구문을 try로 묶고 finally에 Lock해제구문을 넣게되면 중간에 return을 하더래도 무조건 finally가 실행되어 Lock해제 된다.
해결책2.
"lock"키워드 사용
- lock내부적으론 위와 같이 Monitor.Enter와 Monitor.Exit로 구현돼 있다.
- Monitor를 사용하는 것보다 좀더 편리하고 안전하게 Atomic영역을 관리할 수 있다.
'프로그래밍 > 네트워크' 카테고리의 다른 글
Spin Lock 개선 (0) | 2021.09.02 |
---|---|
SpinLock (0) | 2021.09.01 |
Race Condition (0) | 2021.08.29 |
Cache (0) | 2021.08.27 |
Thread의 생성 (0) | 2021.08.27 |