Rumah > pembangunan bahagian belakang > Golang > Adakah Tugasan Penunjuk Atom dalam Go, dan Bagaimana Ia Boleh Dibuat Selamat?

Adakah Tugasan Penunjuk Atom dalam Go, dan Bagaimana Ia Boleh Dibuat Selamat?

Linda Hamilton
Lepaskan: 2024-12-24 14:09:10
asal
291 orang telah melayarinya

Is Pointer Assignment Atomic in Go, and How Can It Be Made Safe?

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:

  1. Peroleh Kunci: Menggunakan kunci (cth., sync.Mutex) memastikan bahawa hanya satu goroutine boleh mengakses penunjuk pada satu masa, menghalang keadaan perlumbaan.
  2. Gunakan Primitif Atom: Pakej sync.atomic menawarkan primitif atom seperti atomic.StorePointer dan atomic.LoadPointer, yang boleh digunakan untuk menetapkan dan mendapatkan penunjuk secara atom nilai.

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()
}
Salin selepas log masuk

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))
}
Salin selepas log masuk

Pertimbangan

  • Menggunakan sync.atomic boleh merumitkan kod kerana keperluan untuk menghantar ke tidak selamat.Tuding.
  • Kunci biasanya dianggap idiomatik dalam Go, manakala penggunaan primitif atom adalah tidak digalakkan.
  • Pendekatan alternatif ialah menggunakan satu goroutine untuk akses penuding dan menyampaikan arahan melalui saluran, yang lebih sejajar dengan model konkurensi Go.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan