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
'developer tip' 카테고리의 다른 글
`raise "foo"`와`raise Exception.new ( "foo")`의 차이점은 무엇입니까? (0) | 2020.08.22 |
---|---|
@RunWith (MockitoJUnitRunner.class) 대 MockitoAnnotations.initMocks (this) (0) | 2020.08.22 |
IISExpress 로그 파일 위치 (0) | 2020.08.22 |
리플렉션을 사용하여 정적 메서드 호출 (0) | 2020.08.22 |
C #에 JWT (JSON Web Token) 예제가 있습니까? (0) | 2020.08.22 |