Ist die Zuweisung eines Zeigers atomic in golang?
Übergibt einen Zeiger atomic-in gehen?
Muss ich zuweisen, die einen Zeiger in einem Schloss? Nehmen wir an, ich möchte nur ordnen Sie die Zeiger auf null, und möchten, dass andere threads in der Lage sein, um es zu sehen. Ich weiß, in java wir verwenden können volatil für diese. Aber es ist nicht volatil zu gehen.
Dank.
- Vielleicht finden Sie diesem thread interessant.
- Vielleicht finden Sie auch das Lesen der "Go-Speicher-Modell" Dokument amüsant-es ist, was definiert die Anforderungen für die Go-Implementierungen. AFAIK ist es nicht, sagen nichts über die Unteilbarkeit von load/store Operationen von primitiven Typen, sondern spricht nur über beobachtbare Bestellung von Ihnen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur Dinge, die garantiert atomar sind in der go sind die Vorgänge in sync.atomic.
Also, wenn Sie sicher sein wollen, müssen Sie nehmen eine Sperre, zB sync.Mutex oder verwenden Sie eine der atomaren primitiven. Ich empfehle, nicht mit der atomaren primitiven, aber Sie müssen verwenden Sie Sie überall Sie verwenden den Zeiger, und Sie sind schwer zu bekommen Recht.
Verwendung des mutex ist OK wechseln Stil - Sie können eine Funktion definieren, um das aktuelle Zeiger mit Verriegelung sehr einfach, z.B. so etwas wie
Diese Funktionen geben eine Kopie des Zeigers an Ihre Kunden, die bleiben konstant, auch wenn der master-Zeiger geändert wird. Dies kann oder kann nicht akzeptabel sein, je nachdem, wie zeitkritisch deine Anforderung ist. Es sollte genug sein, um keine undefinierten Verhalten der garbage collector wird dafür sorgen, dass der Zeiger gültig bleibt zu allen Zeiten, auch wenn der Speicher darauf hingewiesen, nicht mehr von Ihrem Programm verwendet.
Ein alternativer Ansatz wäre es, nur die Zeiger Zugriff von einem go-routine und die Kanäle zu Befehl, gehen routine Dinge zu tun. Das wäre mehr als idiomatische gehen, aber möglicherweise nicht für Ihre Anwendung genau.
Update
Hier ist ein Beispiel zeigen, wie zu verwenden
atomic.SetPointer
. Es ist ziemlich hässlich durch die Verwendung vonunsafe.Pointer
. Allerdingsunsafe.Pointer
wirft kompilieren zu nichts, so die Laufzeit Kosten wird, klein ist.StorePointer
Beispiel.atomic.StorePointer
, ist es erforderlich, dassatomic.ReadPointer
um es zu Lesen oder eine reguläre non-atomic Lesen, okay? Die store-Barriere verwendet, die inatomic.StorePointer
sollte block gleichzeitige liest, so klingt es für mich nutzlos mitatomic.ReadPointer
in diesem Fall. Ist das richtig?Da die Skillung ist nicht angegeben, sollten Sie davon ausgehen, es ist nicht. Auch, wenn es aktuell Atomare es ist möglich, dass es sich ändern könnte, ohne jemals gegen das spec.