Zeiger atomar in Go zuweisen
Go bietet eine Vielzahl von Tools zum Verwalten der Parallelität, aber eine häufig gestellte Frage ist, ob ein Zeiger zugewiesen werden soll ist eine atomare Operation.
Atomoperationen in Go
In Go sind die einzigen Operationen, die garantiert atomar sind, diejenigen im sync.atomic-Paket. Daher ist die Zuweisung eines Zeigers nicht von Natur aus atomar.
Sichere Zeigerzuweisung
Um einen Zeiger atomar zuzuweisen, haben Sie zwei Möglichkeiten:
Beispiel mit Mutex
Hier ist ein Beispiel mit einem sync.Mutex zum Schutz einer Zeigerzuweisung:
import "sync" var secretPointer *int var pointerLock sync.Mutex func CurrentPointer() *int { pointerLock.Lock() defer pointerLock.Unlock() return secretPointer } func SetPointer(p *int) { pointerLock.Lock() secretPointer = p pointerLock.Unlock() }
Beispiel mit atomaren Grundkörpern
Alternativ: Sie können atomare Grundelemente verwenden, um Atomizität zu erreichen:
import "sync/atomic" import "unsafe" type Struct struct { p unsafe.Pointer // some pointer } func main() { data := 1 info := Struct{p: unsafe.Pointer(&data)} fmt.Printf("info is %d\n", *(*int)(info.p)) otherData := 2 atomic.StorePointer(&info.p, unsafe.Pointer(&otherData)) fmt.Printf("info is %d\n", *(*int)(info.p)) }
Überlegungen
Das obige ist der detaillierte Inhalt vonIst die Zeigerzuweisung in Go atomar und wie kann sie sicher gemacht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!