friend void swap(X& lhs, X& rhs)
{
if (&lhs == &rhs)
return;
std::scoped_lock guard(lhs.m, rhs.m);
swap(lhs.some_detail, rhs.some_detail);
}
이런 코드 있으면 scoped_lock 덕분에 락 풀릴 때 걸때의 역순으로 해서 데드락 방지하잖아요
그런데 다른 곳에서도 동시에 swap이 실행되고 마침 거기서는 lhs rhs가 반대였다고 치면 그 문제는 어떻게 되나요? 그러면 데드락 가능할 것 같은데요
scoped_lock은 argument 순서 상관없이 같은 순서로 lock함
std::lock(a, b), std::lock(b, a) std::scoped_lock{a,b}, std::scoped_lock{b,a} 두케이스 다 lock-order로 인한 deadlock은 없음
서로 다른 함수에서 반대로 파라미터 넣어서 락한데 순서가 안 다르다고? 그건 아닌데 무조건 아규먼트 순서대로 락할뿐더러 그거 아니면 임의의 객체들에 대해 순서를 어떻게 정함 글 내용 잘못 이해한거 아님?
The objects are locked by an unspecified series of calls to lock, try_lock, and unlock. 인자 순서 상관 없이 그 안에서 알아서 락하는건 맞는데
이함수 락하는 순서와 다른 함수 락하는 순서 엉키는건 어떻게 해결된다는건지 모르겠네
아 너말이맞음 뭘 물어보는지 잘못이해함 함수"밖에서" argument 순서가바뀌면 어케되냐를 물어본거?
std::scoped_lock 구현을 설명하자면 MSVC기준으로 scoped_lock constructor 가 tuple mutex... 초기화 후 std::lock 호출 std::lock 는 lock(), try_lock(), unlock(), yield() spin돌면서 deadlock safety를 보장함 std::lock이 컴파일타임에 순서를 바꿔주거나 이런게 아니라 걍 내부적으로 spin하는 메커니즘이라 어차피 결과는 같음