Antwort: keine. Darum geht es in diesen Abschnitten von Herlihy und Shavits The Art of Multiprocessor Programming nicht. In den Kapiteln zum gegenseitigen Ausschluss geben Herlihy und Shavit Ihnen keine Alternativen zur pthread
Bibliothek, sondern zeigen Ihnen, wie sie das Äquivalent der Bibliothek implementierenpthread
.
Kapitel 2 von Herlihy und Shavit trägt den Titel "Gegenseitiger Ausschluss". Es bietet eine Vielzahl klassischer Algorithmen zur Implementierung des Äquivalents pthread_mutex_lock()
mit nur sequentiell konsistentem gemeinsam genutztem Speicher. Meine Antworten https://cs.stackexchange.com/a/12632/7459 und https://cs.stackexchange.com/a/30249/7459 diskutieren die Bedeutung dieser Implementierungen und haben einen Zeiger auf eine, die für praktisch ist Verwendung auf Computern ohne integrierte Hardware-Synchronisierungsvorgänge. (Lamports 1987er Artikel in ACM Trans. On Computer Systems).
Kapitel 7 von Herlihy und Shavit enthält eine Vielzahl von Spin- und Queue-Lock-Implementierungen, die dem Äquivalent von entsprechen pthread_mutex_lock()
, und Kapitel 8 wird erweitert, um pthread_cond_t
(Bedingungsvariablen) pthread_rwlock_t
(Lese- / Schreibsperren) zu diskutieren und kurz darauf einzugehen semaphores
. Es kann Situationen geben, in denen aus Leistungsgründen (aber normalerweise nicht) pthread_rwlock_t
eine Alternative verwendet werden kann, pthread_lock_t
und in Posix müssen Sie diese semaphores
für die Synchronisation zwischen Prozessen verwenden.
In den Kapiteln 9 bis 16 werden hauptsächlich Anwendungen (verschiedene Arten von gleichzeitigen Containern) behandelt. Kapitel 17 beschreibt kurz das Äquivalent von pthread_barrier_t
.
Alles in allem sind Herlihy und Shavit zwei der lautstärksten Befürworter des Transaktionsgedächtnisses und einer Vielzahl von Arten der nicht blockierenden (und wartungsfreien) Synchronisation. Diese Techniken sind in bestimmten Fällen als Alternativen zum gegenseitigen Ausschluss gedacht . Herlihy und Shavit streuen in den Kapiteln 9 bis 16 verschiedene nicht blockierende Implementierungen und gehen dann in Kapitel 18 auf das Transaktionsgedächtnis ein.
Transaktionsspeicher und andere nicht blockierende Synchronisationstechniken sollen das Problem lösen, dass einige schlecht entworfene Algorithmen Threads erfordern, um ihre kritischen Abschnitte für eine sehr lange Zeit zu halten. Transaktionsspeicher und wirklich nicht blockierende Synchronisation sind derzeit in keiner realen Situation praktische Alternativen, aber die Techniken zum Transformieren blockierender Datenstrukturen in nicht blockierende Datenstrukturen sind in der Praxis nützlich, um die Zeit zu minimieren, die eine blockierende Datenstruktur in ihrem kritischen Bereich verbleibt Sektion. (Oft können Sie die Größe des kritischen Abschnitts auf nur ein paar Maschinenanweisungen reduzieren.)