Kann eine Warteschlange sperrenfrei sein, wenn PUSH-Vorgänge POP-Vorgänge blockieren können?
Anekdotisch wird „sperrenfrei“ oft fälschlicherweise verwendet bedeutet „gleichzeitige Programmierung ohne Mutexe“. Sperrfreie Algorithmen bieten tatsächlich Fortschrittsgarantien, unabhängig von den Aktionen anderer Threads. Dies bedeutet, dass es keinen Code geben sollte, bei dem ein Thread von einem anderen abhängt, um fortzufahren.
Stellen Sie sich eine zirkuläre Pufferwarteschlange in liblfds vor, die auf Parallelität ohne explizite Mutexe abzielt. Der PUSH-Algorithmus beinhaltet die Reservierung eines Slots durch Vergleich des Schreibindex und Aktualisierung der Sequenznummer. Obwohl es mit einem einzelnen CAS effizient ist, wirft es Fragen zur Sperrenfreiheit auf.
Einerseits können Threads immer in die Warteschlange gestellt werden, wenn Slots verfügbar sind. Wenn jedoch andererseits ein PUSH-Vorgang unterbrochen wird, bevor die Sequenznummer aktualisiert wird, schlagen nachfolgende POP-Vorgänge fehl, sodass die Warteschlange leer erscheint.
Unter der Definition von Sperrenfreiheit als „eine Struktur ist verwendbar, wenn „Da jeder Thread auf unbestimmte Zeit angehalten wird“, ist diese Warteschlange nicht streng sperrenfrei. Sie verfügt über einen versteckten Mutex-Mechanismus (den Schreibindex und die Sequenznummer), bei dem Autoren aufgrund eines angehaltenen Schreibers im kritischen Bereich möglicherweise nicht in der Lage sind, Elemente einzufügen.
Die Warteschlange kann jedoch dennoch einige nützliche Eigenschaften aufweisen. Aufgrund seines geringen Overheads verfügt es über eine angemessene, unangefochtene Leistung, bewältigt konkurrenzfähige Leistung angemessen und ist teilweise immun gegen Kontextwechsel. Darüber hinaus unterstützt es den Warteschlangenzugriff über Interrupts oder Signale, weist jedoch Einschränkungen bei der Verarbeitung der asynchronen Thread-Beendigung auf.
Auch wenn die liblfds-Warteschlange die strenge Definition der Sperrenfreiheit möglicherweise nicht vollständig erfüllt, kann sie dennoch mit Sicherheit von Vorteil sein Anwendungen. Es bietet teilweise Fortschrittsgarantien und angemessene Leistungsmerkmale, ohne die Komplexität von Mutex-basierten Lösungen.
Das obige ist der detaillierte Inhalt vonIst eine kreisförmige Pufferwarteschlange wirklich sperrenfrei, wenn PUSH-Vorgänge POP-Vorgänge blockieren können?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!