> 백엔드 개발 > C++ > `condition_variable.notify_one()`을 호출하기 전에 잠금을 획득해야 합니까?

`condition_variable.notify_one()`을 호출하기 전에 잠금을 획득해야 합니까?

Mary-Kate Olsen
풀어 주다: 2024-11-07 10:27:02
원래의
1043명이 탐색했습니다.

Should You Acquire a Lock Before Calling `condition_variable.notify_one()`?

조건을 알리기 전에 잠금 획득의 비밀 풀기

조건 변수의 사용은 멀티스레드 환경에서 동기화의 기본 측면입니다. 흔히 발생하는 질문 중 하나는 Condition_variable.notify_one()을 호출하기 전에 잠금을 획득해야 하는지 여부입니다.

notify_one() 전에 잠금 획득

기술적으로는 Condition_variable.notify_one()을 호출하기 전 잠금은 필수가 아닙니다. 그러나 특정 시나리오에서는 이는 좋은 사례로 간주됩니다.

잠금의 이점

알리기 전에 잠그면 알림과 잠금 해제 사이의 경합 상태를 방지할 수 있습니다. 예를 들어, 알림 스레드가 inform_one()을 호출한 후 즉시 잠금을 해제하는 경우 알림 스레드는 알림 스레드가 공유 리소스를 업데이트할 기회를 갖기 전에 잠금을 획득하고 공유 리소스에 액세스할 수 있습니다. 이러한 경쟁 상태를 방지하려면 공유 리소스가 업데이트될 때까지 잠금을 유지하는 것이 좋습니다.

잠그지 말아야 할 경우

다음과 같은 경우에는 잠금이 필요하지 않습니다. 알림 스레드가 공유 리소스를 수정하지 않습니다. 예를 들어, inform_one() 호출이 순전히 데이터를 수정하지 않고 대기 중인 스레드를 깨우기 위한 것이라면 잠금은 중복될 것입니다.

예외 대기에 대한 예외

예외 cv.wait(lk, []{return i == 1;})와 같은 조건자 기반 대기 호출을 사용할 때 inform_one()이 발생하기 전에 잠금이라는 일반 규칙을 따릅니다. 이러한 경우, inform_one() 이전에 잠금을 획득하는 것은 중복됩니다. 왜냐하면 조건자 자체가 대기 스레드가 실행을 재개하기 전에 대기 조건이 충족되도록 보장하기 때문입니다.

예시 분석

제공된 예에서는 알림 스레드가 공유 리소스를 업데이트하지 않기 때문에 첫 번째 inform_one() 호출이 잠기지 않습니다. 그러나 이후의 inform_one() 호출은 공유 리소스가 수정되는 루프 내에 있기 때문에 잠깁니다(i는 1로 설정됨).

결론

또는 Condition_variable.notify_one()이 특정 동기화 요구 사항에 따라 달라지기 전에 잠금을 획득하지 않는 것이 좋습니다. 대부분의 경우 잠금은 데이터 수정 중 경쟁 조건을 방지하는 데 유용합니다. 그러나 inform_one() 호출이 공유 리소스를 수정하지 않고 대기 중인 스레드를 깨우기 위한 용도로만 사용되거나 조건자 기반 대기 호출을 사용하는 경우에는 필요하지 않습니다.

위 내용은 `condition_variable.notify_one()`을 호출하기 전에 잠금을 획득해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿