condition_variable.notify_one()을 호출하기 전에 언제 잠금을 획득해야 합니까?
멀티스레드 프로그래밍에서 조건_변수는 대기 스레드에 신호를 보내는 데 사용됩니다. 특정 조건이 충족되었습니다. Condition_variable.wait()를 호출하기 전에 잠금을 유지해야 하지만, inform_one()을 호출하기 전에 잠금도 필요한지 여부에 대해서는 약간의 불확실성이 있습니다.
notify_one() 전에 뮤텍스를 잠글 수 있나요? ) 그리고 그 이유는 무엇입니까?
notify_one() 전에 뮤텍스를 잠그는 것은 필수는 아니지만 특정 시나리오에서는 유리할 수 있습니다. 통지 스레드가 inform_one()을 호출하기 전에 잠금을 해제하면 대기 중인 스레드가 즉시 실행을 시작할 수 있습니다. 그러나 알림 스레드가 잠금을 보유하는 경우 대기 스레드는 진행하기 전에 잠금이 해제될 때까지 기다려야 합니다.
notify_one()에 대한 후속 호출 전 잠금에 대한 이론적 근거
제공된 예에서는 초기 inform_one() 이후 임계 섹션 내에서 i 변수가 수정되기 때문에 후속 호출에 대해 잠금이 획득됩니다. 이렇게 하면 실행을 재개할 때 대기 중인 스레드가 업데이트된 i 값을 관찰할 수 있습니다.
가능한 경쟁 조건 방지
어떤 사람들은 첫 번째 실행 중에 잠금을 유지하지 않는다고 주장할 수도 있습니다. inform_one() 호출은 소비자 스레드가 조기에 실행을 재개하고 알림을 놓치는 경쟁 조건으로 이어질 수 있습니다. 그러나 이는 유효한 문제가 아닙니다.
C 표준에 따르면, Condition_variable::wait()는 조건자를 지속적으로 확인하고 필요한 경우 기다리는 내부 루프처럼 동작합니다. 이 경우 술어는 [] { return i == 1; }. 소비자 스레드가 확인할 때 i가 1이 아니면 내부 루프가 종료되어 스레드가 실행을 다시 시작하지 못하게 됩니다.
따라서 소비자 스레드가 확인하기 전에 생산자 스레드가 inform_one()을 호출하더라도 i, 소비자 스레드는 알림을 놓치지 않습니다.
결론
엄격히 요구되는 것은 아니지만 뮤텍스를 잠그기 전에 특정 시나리오에서는 Condition_variable.notify_one()을 호출하는 것이 도움이 될 수 있습니다. 이를 통해 대기 중인 스레드가 즉시 실행을 재개할 수 있으며 대기 중인 스레드가 공유 데이터(이 경우 i 값)의 업데이트된 상태를 관찰하도록 보장합니다. 효과적인 멀티스레드 프로그래밍을 위해서는 Condition_variables의 동작을 이해하고 잠금을 사용하여 스레드를 적절하게 동기화하는 것이 중요합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3