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
Linda Hamiltonasal
2024-12-24 14:09:10360semak imbas

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()
}

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

  • 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!

Kenyataan:
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