Atomicity of Pointer Assignments dalam Go
Adakah memberikan penunjuk dalam Go atomic? Dalam erti kata lain, bolehkah berbilang rangkaian serentak memanipulasi penuding tanpa menyebabkan gelagat yang tidak ditentukan?
Jawapan:
Operasi atom dalam Go adalah terhad kepada yang ditakrifkan secara eksplisit dalam penyegerakan. pakej atom. Oleh itu, memberikan penuding biasa tidak dijamin sebagai atom.
Untuk memastikan gelagat yang konsisten merentas urutan, anda mempunyai dua pilihan:
1. Penyegerakan dengan Kunci:
Gunakan primitif penyegerakan seperti penyegerakan.Mutex untuk melindungi akses kepada penuding. Contohnya:
var p *int var lock sync.Mutex func GetPointer() *int { lock.Lock() defer lock.Unlock() return p } func SetPointer(value *int) { lock.Lock() p = value lock.Unlock() }
2. Primitif Atom (Dinasihatkan Berhati-hati):
Sebagai alternatif, anda boleh menggunakan sync.atomic untuk melaksanakan tugasan penunjuk atom. Walau bagaimanapun, pendekatan ini memerlukan pengendalian berhati-hati terhadap penukaran penunjuk yang tidak selamat:
import ( "sync/atomic" "unsafe" ) var p = unsafe.Pointer(nil) func SetPointer(value *int) { atomic.StorePointer(&p, unsafe.Pointer(value)) }
Cadangan:
Walaupun primitif atom menyediakan cara yang mudah untuk melaksanakan operasi atom, ia boleh terdedah kepada kesilapan. Menggunakan mutex biasanya diutamakan dalam Go untuk melindungi akses serentak kepada data kongsi.
Atas ialah kandungan terperinci Adakah Tugasan Penunjuk dalam Go Atomic?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!