std::lock(), std::adopt_lock
mutex m1;
mutex m2;
std::lock(m1,m2);
//내부적으로 정한 방식에 의해서 항상 동일한 순서로 m1,m2의 lock을 걸어줍니다.
//먼저 lock걸리는것이 무엇인지는 모르지만 매번 그 순서는 동일합니다.
lock_guard<mutex> g1(m1,std::adopt_lock);
lock_guard<mutex> g2(m2,std::adopt_lock);
//std::adopt_lock : 이미 lock된 상태니까, 나중에 소멸될 때 unlock 해줘!
std::lock()을 통해서 일정한 순서를 유지한채 lock을 걸 수 있습니다.
2개 이상의 mutex가 들어 갈 수 있습니다.
무엇이 먼저 lock걸릴지는 모르지만 항상 그 순서는 일정합니다.
lock_guard<>()에 std::adopt_locck을 옵션으로 주어서
소멸될때 unlock시키는 방법도 가능합니다.
그 외 아이디어
- mutex를 다루는 별도의 클래스를 만들어주고, 일종의 ID를 부여해서, 무조건 ID가 큰 애가 먼저 실행이 되어야 하는등 규칙을 설정하기.
- 아래 그림처럼 Lock을 그래프를 통해서 추적해서, 순환이 일어나는지 확인하기(순환이 일어나면 비정상 상황으로 간주)
'BackEnd > IOCP게임서버' 카테고리의 다른 글
[C++ 서버] Lock 기초(mutex) (0) | 2023.02.25 |
---|---|
[C++서버] Atomic (0) | 2023.02.25 |
[C++서버] 쓰레드 기초 (0) | 2023.02.25 |
[C++ 서버] 환경 설정 (0) | 2022.08.08 |