Wann ist pthread_spin_lock die richtige Sache zu verwenden (über z. B. ein Pthread Mutex)?
Gegeben, dass pthread_spin_lock ist verfügbar, wenn würde ich es verwenden, und Wann sollte man Sie nicht verwenden ?
d.h. wie würde ich entscheiden, zu schützen, einige gemeinsam genutzte Datenstruktur, die entweder mit einer pthread mutex oder eine pthread spinlock ?
InformationsquelleAutor der Frage Lyke | 2011-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist, dass ein spinlock kann besser sein, wenn Sie planen, halten das Schloss für eine extrem kurze Intervall (zum Beispiel, nichts zu tun, aber Inkrementieren eines Zählers), und die Behauptung ist dürfte eher selten sein, aber die Bedienung geschieht oft genug, um eine potenzielle performance-Engpass. Die Vorteile eines spinlock über ein mutex sind:
Punkt 1 wird immer stehen, aber Punkt 2 und 3 sind etwas verringert Nützlichkeit, wenn man bedenkt, dass gute mutex-Implementierungen wahrscheinlich spin, eine anständige Anzahl von Zeiten, bevor du den kernel für die Hilfe warten.
Nun die lange Antwort:
Was Sie sich Fragen müssen vor der Verwendung von spinlocks ist, ob diese potenziellen Vorteile überwiegen eine sehr seltene, aber echte Nachteil: was passiert, wenn der Faden, der hält die Sperre unterbrochen wird, durch den scheduler, bevor es die Sperre. Dies ist natürlich selten, aber es kann sogar passieren, wenn die Sperre hielt nur für eine einzelne variable-Inkrement-operation oder etwas anderes ebenso trivial. In diesem Fall werden alle anderen threads versucht, um die Sperre zu halten Spinnen, bis der thread, der hält die Sperre wird geplant und eine chance hat, um Sie zu entriegeln. Dies kann nie geschehen, wenn die threads zu erhalten zu versuchen das Schloss höhere Prioritäten haben als der thread, hält die Sperre. Das mag ein extremer Fall sein, aber auch ohne andere Prioritäten im Spiel ist, kann es sehr lange Wartezeiten vor der Schleuse Besitzer bekommt wieder geplant, und das Schlimmste von allen, sobald diese situation beginnt, kann es schnell eskalieren, als viele threads, die alle in der Hoffnung, um die Sperre beginnt sich zu drehen auf, binden mehr Prozessor-Zeit, und die weitere Verzögerung der Planung des Threads, könnte die Sperre.
Als solche, wäre ich vorsichtig mit spinlocks... 🙂
InformationsquelleAutor der Antwort R..
Den spinlock ist ein "busy waiting" zu sperren. Es ist Hauptvorteil ist, dass es hält den thread aktiv und wird nicht dazu führen, einen Kontext wechseln, so dass, wenn Sie wissen, dass Sie nur darauf warten, für eine sehr kurze Zeit (weil Ihr Kritischer Vorgang ist sehr schnell), dann kann eine bessere Leistung als ein mutex. Umgekehrt ein mutex wird dazu führen, dass weniger Last auf dem system, wenn der kritische Abschnitt nimmt eine lange Zeit und ein context-switch ist wünschenswert.
TL;DR: Es hängt davon ab.
InformationsquelleAutor der Antwort Kerrek SB
Ist die sicherste Methode, mit einem performance-boost ist eine Mischung aus den beiden: eine adaptive mutex.
Wenn Ihr system mehrere Kerne spin für ein paar tausend Zyklen zu erfassen, die am besten bei niedrigen oder keinen Streit, dann verschieben, um eine vollständige mutex, um die Ausbeute zu anderen threads für lange behauptet, die sperren.
Sowohl POSIX (
PTHREAD_MUTEX_ADAPTIVE_NP
) und Win32 (SetCriticalSectionSpinCount
) haben adaptive Mutexe, viele Plattformen, die nicht über ein POSIX-spinlock-API.InformationsquelleAutor der Antwort Steve-o
Spinlock hat nur Interesse an der MP Kontext. Es wird verwendet, um auszuführen, pseudo-atomistischen Aufgaben. In monoprozessor-system-das Prinzip ist das folgende :
Aber in MP-Systemen haben wir keine Garantien, dass ein anderer Kern nicht aus einem anderen thread, dass könnte geben Sie unseren code-Abschnitt. Um zu verhindern, dass diese den spin lock erstellt wurde, dessen Zweck es ist, zu verschieben, die anderen Kerne Ausführung verhindert Parallelität Problem. Der kritische Abschnitt wird zu :
Wenn die Aufgabe Sperre weggelassen wird, während ein Planungs -, ein anderer thread könnte versuchen, geben Sie dem Abschnitt wird die Schleife bei 100% CPU warten nächste Planung. Wenn dieser Aufgabe eine hohe Priorität ein, wird dies zu einer deadlock.
InformationsquelleAutor der Antwort Sebastien Kurz