developer tip

std :: lock_guard 또는 std :: scoped_lock?

optionbox 2020. 8. 22. 08:41
반응형

std :: lock_guard 또는 std :: scoped_lock?


C ++ 17에서는 std::scoped_lock.

문서를 보면 이미 존재하는 std::lock_guard클래스 와 비슷해 보입니다 .

차이점은 무엇이며 언제 사용해야합니까?


scoped_lock의 엄격 우수한 버전 lock_guard즉 (같은 교착 상태 회피 알고리즘 등을 이용하여 한번에 뮤텍스 모든 임의의 수를 잠근다 std::lock). 새 코드에서는 scoped_lock.

lock_guard여전히 존재 하는 유일한 이유 는 호환성 때문입니다. 현재 코드에서 사용되기 때문에 삭제할 수는 없습니다. 더욱이 정의를 (단항에서 가변으로) 변경하는 것은 바람직하지 않은 것으로 판명되었습니다. 왜냐하면 그것은 또한 관찰 가능하고 따라서 파괴되는 변경이기 때문입니다 (그러나 다소 기술적 이유 때문에).


하나의 중요한 차이점은 std::scoped_lock하나 이상의 뮤텍스를 취하는 가변 생성자가 있다는 것입니다. 이렇게하면 std::lock사용 된 것처럼 여러 뮤텍스를 교착 상태로 잠글 수 있습니다 .

{
    // safely locked as if using std::lock
    std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);     
}

이전에는 이 답변에std::lock 설명 된대로 안전한 방법으로 여러 뮤텍스를 잠그기 위해 약간의 춤을 추어 야했습니다 .

스코프 잠금을 추가하면이를 사용하기 쉽고 관련 오류를 피할 수 있습니다. std::lock_guard더 이상 사용되지 않는 것으로 간주 할 수 있습니다 . 의 단일 인수 사례 std::scoped_lock는 전문화로 구현할 수 있으므로 가능한 성능 문제에 대해 걱정할 필요가 없습니다.

GCC 7에는 이미 여기에서std::scoped_lock 볼 수있는 지원 이 있습니다 .

자세한 내용은 표준 문서 를 읽을 수 있습니다.


다음은 C ++ Concurrency in Action 의 샘플과 인용문입니다 .

friend void swap(X& lhs, X& rhs)
{
    if (&lhs == & rhs)
        return;
    std::lock(lhs.m, rhs.m);
    std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock);
    std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock);
    swap(lhs.some_detail, rhs.some_detail);
}

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);
}

의 존재는 C ++ 17 이전에 std::scoped_lock사용했던 대부분의 경우 std::lock를 이제를 사용하여 작성할 std::scoped_lock수 있음을 의미하며, 이는 실수 가능성이 적습니다.

참고 URL : https://stackoverflow.com/questions/43019598/stdlock-guard-or-stdscoped-lock

반응형