일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 재귀
- 다이나믹 프로그래밍
- c++
- 알고리즘
- 그래프
- 정렬
- 투 포인터
- 문자열
- 유니온 파인드
- BFS
- 시뮬레이션
- 스택
- ue5
- 자료구조
- Unreal Engine 5
- 누적 합
- 트리
- 우선순위 큐
- 백준
- 유니티
- VR
- 백트래킹
- Team Fortress 2
- 구현
- 다익스트라
- DFS
- 수학
- XR Interaction Toolkit
- 그리디 알고리즘
- 브루트포스
- Today
- Total
1일1알
Lock 본문
Critical Section (임계 영역)
Critical Section이란 두개 이상의 쓰레드가 동시에 공유 자원을 접근할 수 있는 코드의 부분을 말한다. 멀티쓰레드 프로그래밍에서는이 Critical Section에 한번에 하나의 쓰레드만 접근이 가능하도록 설계를 해야 한다.
그래서 Lock 등의 방법을 사용하여 Critical Section에는 한번에 하나의 쓰레드만 접근하도록 할 수 있고, 이렇게 한번에 하나의 쓰레드만 접근하도록 하여 공유 자원의 동시 사용을 막는 것을 Mutual Exclusion(상호 배제)라고 한다.
DeadLock (데드락, 교착상태)
경우에 따라서 Lock 안에서 또 Lock을 잡아야 하는 경우가 있을 수 있다.
1번 쓰레드에서 1번 Lock을 잡고 그 안에서 2번 Lock을 잡는 것과 동시에
2번 쓰레드에서 2번 Lock을 잡고 그 안에서 1번 Lock을 잡는 상황이 있다고 가정했을때,
만약 1번 쓰레드에서 1번 Lock을 잡는 순간에 2번 쓰레드에서 2번 Lock을 잡았다면 1번 쓰레드에서는 2번 Lock이 풀려야 다음 로직을 수행할 수 있고, 2번 쓰레드에서는 1번 Lock이 풀려야 다음 로직을 수행할 수 있는데 서로 Lock을 물고 풀어주지 않으니 아무것도 할 수 없는 상황이 발생한다.
이렇게 서로가 서로의 Lock을 물고있는 상황을 DeadLock이라고 한다.
위와 같이 멍청하게 코드를 짜는 일이 있겠냐고 생각할 수 있지만 저건 그저 예시일 뿐이고 코드가 방대해지다보면 예상하지 못한 곳에서 위와 같은 상황이 발생할 수 있고, 생각보다 자주 일어난다고 한다.
그렇다면 이것을 어떻게 예방할 수 있을까?
일정시간이 지나면 잡고있는 Lock을 놔주는 방법, Lock의 순서를 정하는 방법 등 여러가지 방법이 있지만 DeadLock이 발생한다는 것 자체가 Lock 구조에 문제가 있다는 뜻이고, 이런 경우를 대비하여 추가적인 코드를 작성하기보단, DeadLock이 발생했다면 그때 원인을 분석하여 수정하는 것이 일반적이다.
'유니티 > C# 서버 연동 유니티 포트폴리오' 카테고리의 다른 글
게임 입장 (0) | 2024.05.04 |
---|---|
서버 - Unity클라 통신 테스트 (0) | 2024.05.03 |
Race Condition(경합 조건), Atomic(원자성) (0) | 2024.04.29 |
캐시 (1) | 2024.04.28 |
멀티쓰레드 프로그래밍 (0) | 2024.04.28 |