Mit einem Single-Core-Prozessor, wo alle Ihre Threads von der einen einzigen CPU ausgeführt werden, die Idee, einen kritischen Abschnitt mit einer atomaren Test-und-Set-Operation auf einigen Mutex (oder Semaphor oder usw.) in der Erinnerung scheint einfach genug; Da Ihr Prozessor ein Test-and-Set von einer Stelle in Ihrem Programm aus ausführt, kann es nicht von einem anderen Punkt in Ihrem Programm ausgeführt werden, der als ein anderer Thread getarnt ist.Kritische Abschnitte mit Multicore-Prozessoren
Aber was passiert, wenn Sie tatsächlich mehr als einen physischen Prozessor haben? Es scheint, dass eine einfache atomare Anordnung auf Befehlsebene nicht ausreichen würde, b/c mit zwei Prozessoren, die möglicherweise ihre Test-und-Set-Operationen gleichzeitig ausführen, was Sie wirklich brauchen, um die Atomizität beizubehalten, ist der Zugriff auf den geteilten Speicher des Mutex. (Und wenn der geteilte Speicherbereich in den Cache geladen wird, gibt es auch die gesamte Cache-Konsistenz-Sache.)
Dies scheint, als würde es weit mehr Overhead als der Single-Core-Fall entstehen, so hier ist das Fleisch von die Frage: Wie viel schlimmer ist es? Ist es schlimmer? Leben wir nur damit? Oder umgehen Sie es, indem Sie eine Richtlinie durchsetzen, nach der alle Threads innerhalb einer Prozessgruppe auf demselben physischen Kern leben müssen?
Ist Test-und-Set garantiert atomar über mehrere CPUs bereits? – Blindy
Test und Set hat nur Consensus-Nummer 2. –