In einem Programm, ich arbeite, habe ich eine Menge von Code wie folgt:Thema sicheres atomare Operationen in gcc
pthread_mutex_lock(&frame->mutex);
frame->variable = variable;
pthread_mutex_unlock(&frame->mutex);
Dies ist eindeutig eine Verschwendung von CPU-Zyklen, wenn die mittlere Anweisung mit nur ersetzt werden ein Atomladen. Ich weiß, dass gcc dazu in der Lage ist, aber ich konnte nicht viel Dokumentation über solche einfachen Thread-sicheren atomaren Operationen finden. Wie würde ich diesen Code mit einer atomaren Operation ersetzen?
(Ich weiß, dass einfache Geschäfte theoretisch Atom sein sollten, aber ich will nicht zu haben, zu hoffen, dass der Optimierer nicht ihre Atom-ness an einem gewissen Punkt in dem Prozess zu vermasseln wird.)
Klärung : Ich brauche sie nicht streng atomar zu sein; Diese Variablen werden nur für die Thread-Synchronisierung verwendet. Das heißt, Thread B liest den Wert, überprüft, ob es korrekt ist, und wenn es nicht korrekt ist, schläft es. Auch wenn Thread A den Wert aktualisiert und Thread B nicht aktualisiert, ist dies kein Problem, da dies bedeutet, dass Thread B nur dann schläft, wenn es nicht wirklich benötigt wird, und wenn es aufwacht, wird der Wert angezeigt sei richtig.
Seit Kernel 2.6 kostet ein Mutex fast nichts mehr, wenn der Mutex frei ist. Anyway, "__sync_lock_test_and_set" (seit gcc 4.1) sollte den Trick machen, das ist nicht die einzige Funktion, die in diesem Fall verwendet werden könnte. – claf
__atomic_store oder __atomic_store_n scheint besser geeignet zu sein. – claf