Menetapkan Penunjuk Secara Atom dalam Go
Go menyediakan pelbagai alat untuk mengurus konkurensi, tetapi satu persoalan yang sering timbul ialah sama ada memberikan penunjuk ialah operasi atom.
Kendalian Atom dalam Go
Dalam Go, satu-satunya operasi yang dijamin bersifat atom ialah operasi yang terdapat dalam pakej sync.atomic. Oleh itu, memberikan penuding bukan atom asli.
Tugas Penunjuk Selamat
Untuk menetapkan penunjuk secara atom, anda mempunyai dua pilihan:
Contoh dengan Mutex
Berikut ialah contoh menggunakan penyegerakan.Mutex untuk melindungi tugasan penunjuk:
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() }
Contoh dengan Atomic Primitif
Sebagai alternatif, anda boleh menggunakan primitif atom untuk mencapai atomicity:
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)) }
Pertimbangan
Atas ialah kandungan terperinci Adakah Tugasan Penunjuk Atom dalam Go, dan Bagaimana Ia Boleh Dibuat Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!