PUSH 작업이 POP 작업을 차단할 수 있는 경우 대기열을 잠금 해제할 수 있나요?
일화에 따르면 "잠금 해제"가 종종 잘못 사용됩니다. "뮤텍스 없는 동시 프로그래밍"을 의미합니다. 잠금 없는 알고리즘은 실제로 다른 스레드의 작업에 관계없이 진행을 보장합니다. 이는 한 스레드가 다른 스레드에 의존하여 진행하는 코드가 없어야 함을 의미합니다.
명시적인 뮤텍스 없이 동시성을 목표로 하는 liblfds의 순환 버퍼 큐를 고려해보세요. PUSH 알고리즘은 쓰기 인덱스를 비교하고 시퀀스 번호를 업데이트하여 슬롯을 예약하는 작업을 포함합니다. 단일 CAS를 사용하면 효율적이지만 잠금 해제 여부에 대한 의문이 제기됩니다.
슬롯이 사용 가능한 경우 스레드는 항상 대기열에 포함될 수 있습니다. 그러나 반면에 시퀀스 번호를 업데이트하기 전에 PUSH 작업이 중단되면 후속 POP 작업이 실패하여 대기열이 비어 있는 것처럼 보입니다.
잠금 방지의 정의에 따르면 "구조는 다음과 같은 경우에 사용할 수 있습니다. 모든 스레드는 무기한 일시 중단됩니다." 이 대기열은 엄격하게 잠금이 없는 대기열이 아닙니다. 여기에는 숨겨진 뮤텍스 메커니즘(쓰기 인덱스 및 시퀀스 번호)이 있어 중요한 영역에서 일시 중지된 기록기로 인해 기록기가 요소를 삽입하지 못할 수 있습니다.
그러나 대기열은 여전히 몇 가지 유용한 속성을 나타낼 수 있습니다. 낮은 오버헤드로 인해 합리적인 비경합 성능을 갖고 경합 성능을 합리적으로 처리하며 부분적으로 컨텍스트 전환이 면역됩니다. 또한 비동기 스레드 종료를 처리하는 데에는 제한이 있지만 인터럽트 또는 신호에서 대기열 액세스를 지원합니다.
liblfds 대기열은 잠금 해제에 대한 엄격한 정의를 완전히 충족하지 못할 수 있지만 특정 경우에는 여전히 도움이 될 수 있습니다. 응용 프로그램. 뮤텍스 기반 솔루션의 복잡성 없이 부분적인 진행을 보장하고 적절한 성능 특성을 제공합니다.
위 내용은 PUSH 작업이 POP 작업을 차단할 수 있는 경우 순환 버퍼 큐는 실제로 잠금이 없습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!