워커 함수에서 인자로 받은 3개의 뮤텍스들을 A -> B -> C 순서로 락한다고 치자
std::lock 락 순서 정하는 법 헷갈리니 그냥 손으로 이 순서로 정했다고 가정
그리고 이 워커 함수로 스레드들을 만드는데
스레드1에 m1, m2, m3 뮤텍스가 들어가면
m1 -> m2 -> m3 순서로 락될거고
스레드2에 m3, m2, m1 뮤텍스가 들어가면
m3 -> m2 -> m1 순서로 락할거 아냐?
그럼 데드락 쌉가능 아님?
워커 함수에서 인자로 받은 3개의 뮤텍스들을 A -> B -> C 순서로 락한다고 치자
std::lock 락 순서 정하는 법 헷갈리니 그냥 손으로 이 순서로 정했다고 가정
그리고 이 워커 함수로 스레드들을 만드는데
스레드1에 m1, m2, m3 뮤텍스가 들어가면
m1 -> m2 -> m3 순서로 락될거고
스레드2에 m3, m2, m1 뮤텍스가 들어가면
m3 -> m2 -> m1 순서로 락할거 아냐?
그럼 데드락 쌉가능 아님?
근데 scoped_lock쓰면 그걸 다 m1 m2 m3 순서대로 락건다 이런거 아님?
저것조차 알아서 정해준다 이건가 그러면 각 뮤텍스의 고유값 같은걸 알아내서 비교해가며 순서 정해주려나
구현도 간단할거같은데 뮤텍스에 id값 넣어놓고 그 순서대로 정렬해서 ㅇㅇ
cppreference 예제보니 다른 함수 call에 신경쓰지 않아도 된다고 써있기는 하네
std::lock이 컴파일타임에 순서를 바꿔주거나 그런게 아니라 lock, try_lock, unlock, yield 같은 while 루프 돌면서 안정성을 보장해주는거라 결과는 같음
아 동작 자체가 생각한거랑 다르구나 이건 소스를 한번 봐야겠네