Wie der Prozessor wissen, welchen Prozess zu entsperren?
Der Prozessor weiß nichts; es führt nur blind die Kette von Maschinenanweisungen aus, die ihm zur Verfügung gestellt wurden.
Die Threading-Bibliothek, auf der anderen Seite wurde sorgfältig entwickelt, um mit dieser Art von Sache umzugehen. Außerdem enthält jedes moderne/Multitasking-Betriebssystem einen Thread-Scheduler, der beim Booten in den Speicher geladen wird, und verwaltet, welche Threads wann ausgeführt werden. Es arbeitet mit der Threading-Bibliothek zusammen, um Probleme beim Sperren/Entsperren korrekt zu behandeln.
Die Frage lautet also: Woher weiß die Betriebssystem-Software, welcher Thread als nächstes aufwachen soll, wenn ein Mutex entsperrt wird?
Natürlich variiert die tatsächliche Implementierung mit dem Betriebssystem, aber konzeptionell können Sie sich jedes Mutex-Objekt mit einer Linked-List vorstellen, und wenn ein Thread versucht, einen Mutex zu sperren, der bereits gesperrt ist, fügt sich der Thread zum Tail hinzu der verknüpften Liste und teilt dem Scheduler dann mit, dass er (der Thread) in den Ruhezustand versetzt wird. Später, wenn der Mutex entsperrt ist, öffnet die Entsperrroutine den ersten schlafenden Thread (falls vorhanden) aus der verknüpften Liste, ordnet dem Thread den Eigentümer des Mutex erneut zu und fordert dann den Scheduler auf, aufzuwachen diesen Thread so schnell wie möglich.
(Vorbehalte: Eine reale Implementierung wäre wahrscheinlich ein bisschen komplexer als das, da es darauf achten muss, Rennbedingungen zu vermeiden und die Leistung zu maximieren, aber ich denke, das gibt Ihnen eine Vorstellung davon, wie es gemacht werden könnte Beachten Sie, dass in dieser Beispielimplementierung Threads den Mutex in der Reihenfolge "first-come/first-served" erhalten, dh in der gleichen Reihenfolge, in der sie lock() aufgerufen haben, aber in vielen Implementierungen der realen Welt ist diese Reihenfolge nicht garantiert. also sollten Sie sich nicht darauf verlassen)
Fragen Sie, wie die Threads/Prozesse, die auf den Mutex warten, vom Kernel geplant werden, um den autonomen "test and set" CPU-Befehl auszuführen und den Mutex zu bekommen? Ich glaube nicht, dass es irgendwelche Garantien darüber gibt, welcher Thread den Mutex zuerst erhält, so dass es mehrere funktionale Implementierungen davon geben könnte. –