>백엔드 개발 >C++ >PUSH 작업이 POP 작업을 차단할 수 있는 경우 순환 버퍼 큐는 실제로 잠금이 없습니까?

PUSH 작업이 POP 작업을 차단할 수 있는 경우 순환 버퍼 큐는 실제로 잠금이 없습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-11 21:10:16632검색

Is a Circular Buffer Queue Truly Lock-Free If PUSH Operations Can Block POP Operations?

PUSH 작업이 POP 작업을 차단할 수 있는 경우 대기열을 잠금 해제할 수 있나요?

일화에 따르면 "잠금 해제"가 종종 잘못 사용됩니다. "뮤텍스 없는 동시 프로그래밍"을 의미합니다. 잠금 없는 알고리즘은 실제로 다른 스레드의 작업에 관계없이 진행을 보장합니다. 이는 한 스레드가 다른 스레드에 의존하여 진행하는 코드가 없어야 함을 의미합니다.

명시적인 뮤텍스 없이 동시성을 목표로 하는 liblfds의 순환 버퍼 큐를 고려해보세요. PUSH 알고리즘은 쓰기 인덱스를 비교하고 시퀀스 번호를 업데이트하여 슬롯을 예약하는 작업을 포함합니다. 단일 CAS를 사용하면 효율적이지만 잠금 해제 여부에 대한 의문이 제기됩니다.

슬롯이 사용 가능한 경우 스레드는 항상 대기열에 포함될 수 있습니다. 그러나 반면에 시퀀스 번호를 업데이트하기 전에 PUSH 작업이 중단되면 후속 POP 작업이 실패하여 대기열이 비어 있는 것처럼 보입니다.

잠금 방지의 정의에 따르면 "구조는 다음과 같은 경우에 사용할 수 있습니다. 모든 스레드는 무기한 일시 중단됩니다." 이 대기열은 엄격하게 잠금이 없는 대기열이 아닙니다. 여기에는 숨겨진 뮤텍스 메커니즘(쓰기 인덱스 및 시퀀스 번호)이 있어 중요한 영역에서 일시 중지된 기록기로 인해 기록기가 요소를 삽입하지 못할 수 있습니다.

그러나 대기열은 여전히 ​​몇 가지 유용한 속성을 나타낼 수 있습니다. 낮은 오버헤드로 인해 합리적인 비경합 성능을 갖고 경합 성능을 합리적으로 처리하며 부분적으로 컨텍스트 전환이 면역됩니다. 또한 비동기 스레드 종료를 처리하는 데에는 제한이 있지만 인터럽트 또는 신호에서 대기열 액세스를 지원합니다.

liblfds 대기열은 잠금 해제에 대한 엄격한 정의를 완전히 충족하지 못할 수 있지만 특정 경우에는 여전히 도움이 될 수 있습니다. 응용 프로그램. 뮤텍스 기반 솔루션의 복잡성 없이 부분적인 진행을 보장하고 적절한 성능 특성을 제공합니다.

위 내용은 PUSH 작업이 POP 작업을 차단할 수 있는 경우 순환 버퍼 큐는 실제로 잠금이 없습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.