Stellen Sie sich vor, Sie hätten eine Plattform, deren native primitive Mutexe auf niedriger Ebene keine "try lock" -Operation haben. Um in diesem Fall einen High-Level-Mutex zu implementieren, müssten Sie eine Zustandsvariable und einen booleschen "is locked" verwenden, der durch den Low-Level-Mutex geschützt wird, um anzuzeigen, dass der High-Level-Mutex gesperrt wurde.
So könnte ein Waitable-Mutex mit einem Low-Level-Primitiv-Mutex (der keine "Trylock" -Operation unterstützt) implementiert werden, um einen High-Level-Mutex zu implementieren (das ist). Der "High-Level-Mutex" kann einfach ein Boolescher Wert sein, der durch den Low-Level-Mutex geschützt wird.
Mutex
- Acquire Low-Level (das ist eine echte Sperroperation auf der primitiven, Implementierung Mutex):
Mit diesem Design, mutex_lock
würde wie folgt umgesetzt werden.
- Wenn High-Level-Mutex gehalten wird, warten Sie auf den High-Level-Mutex.
- Erwerben High-Level-Mutex (nur
locked = true;
).
- L-Pegel-Mutex freigeben.
- Acquire Low-Level-Mutex:
Und mutex_unlock
würde wie folgt umgesetzt werden.
- High-Level-Mutex freigeben (nur
locked = false;
)
- Signal der Zustandsvariablen.
- Lassen Sie den Low-Level-Mutex los. Mutex
- Acquire Low-Level:
In diesem Fall mutex_trylock
würde wie folgt umgesetzt werden.
- Überprüfen, ob High-Level-Mutex gehalten wird.
- Wenn ja, geben Sie Low-Level-Mutex und Fehler zurück.
- Nehmen Sie High-Level-Mutex.
- L-Pegel-Mutex freigeben.
- Zurück Erfolg.
Stellen Sie sich vor, wenn wir nach dem Schritt 2, aber vor dem Schritt unterbrochen sind 3.
Bei https://lwn.net/Articles/167034 fand ich die folgende Aussage "Diese Einschränkung scheint mehr damit zu tun zu haben, Mutexe davon abzuhalten, jemals als Vervollständigung verwendet zu werden, als eine grundlegende Einschränkung", aber ich kann nicht wirklich zu verstehen, was es bedeutet (was ist Fertigstellungen)? – user3740387
Wie ich verstehe, bedeutet "Vervollständigungen" die Verwendung von Mutex als Vervollständigungssignal. Zum Beispiel versucht A, einen Mutex zu halten, der bereits durch B gesperrt ist. Er lässt A warten. Dann kann A durch Loslassen der Sperre mit B fortfahren. In dem Artikel, den du erwähnt hast, heißt es: "Ein Mutex kann nur vom Besitzer freigeschaltet werden - was eine Aufgabe sein muss." Mutex kann jedoch durch eine einzelne Aufgabe gesperrt/entsperrt werden, wobei der Usecase ein kritischer Abschnitt sein sollte. – jaeyong