Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bincangkan isu atomicity bagi pembolehubah tugasan di Golang

Bincangkan isu atomicity bagi pembolehubah tugasan di Golang

WBOY
WBOYasal
2024-01-03 16:27:121120semak imbas

Bincangkan isu atomicity bagi pembolehubah tugasan di Golang

Perbincangan tentang keatoman tugasan pembolehubah di Golang

Dalam pengaturcaraan serentak, atomicity ialah konsep utama. Operasi atom merujuk kepada operasi yang tidak boleh diganggu, iaitu, sama ada kesemuanya berjaya dilaksanakan atau tiada satu pun daripadanya dilaksanakan, dan tidak akan ada pelaksanaan separa. Di Golang, operasi atom dilaksanakan melalui pakej penyegerakan/atom, yang boleh memastikan keselamatan serentak.

Adakah operasi penugasan pembolehubah di Golang juga operasi atom? Ini adalah persoalan yang perlu kita terokai. Artikel ini akan membincangkan atomiti tugasan pembolehubah di Golang secara terperinci dan memberikan contoh kod khusus.

Golang menyediakan pelbagai jenis pembolehubah, termasuk jenis asas dan jenis rujukan. Untuk jenis asas, seperti int, apungan, dsb., operasi penetapan pembolehubah adalah atom. Ini kerana penetapan jenis asas dilakukan secara langsung dalam ingatan dan tidak melibatkan operasi yang kompleks.

Berikut ialah contoh mudah yang menunjukkan operasi penetapan atom pembolehubah jenis asas:

package main

import (
    "fmt"
    "sync/atomic"
)

func main() {
    var count int64
    atomic.StoreInt64(&count, 10)
    fmt.Println(count) // 输出:10
}

Dalam contoh di atas, kami menggunakan fungsi StoreInt64 bagi pakej atom untuk menetapkan kiraan pembolehubah jenis int64 kepada 10. Operasi penugasan adalah atom, memastikan integriti tugasan walaupun dalam persekitaran serentak.

Walau bagaimanapun, untuk pembolehubah jenis rujukan (seperti hirisan, peta, antara muka, dll.), operasi penetapan pembolehubah itu bukan atom. Memandangkan pembolehubah jenis rujukan mungkin mengandungi berbilang medan, operasi tugasan melibatkan proses menyalin rujukan dan menyalin struktur data. Oleh itu, dalam persekitaran serentak, operasi penugasan kepada pembolehubah jenis rujukan boleh menyebabkan persaingan data, yang membawa kepada ketidakkonsistenan data.

Berikut ialah contoh yang menunjukkan operasi bukan atom penugasan kepada pembolehubah jenis rujukan:

package main

import (
    "fmt"
    "sync/atomic"
)

type Data struct {
    Num int
}

func main() {
    var data atomic.Value
    data.Store(&Data{Num: 10})

    go func() {
        data.Store(&Data{Num: 20})
    }()

    go func() {
        fmt.Println(data.Load().(*Data).Num)
    }()

    // 主线程等待其他goroutine执行完毕
    time.Sleep(time.Second)
}

Dalam contoh di atas, kami menggunakan jenis Nilai pakej atom untuk menyimpan pembolehubah jenis rujukan. Kami menetapkan data dalam goroutine utama dan mengarahkannya ke penunjuk jenis Data. Kemudian, dalam dua goroutine serentak, kami mengubah suai nilai data kepada kejadian Data yang berbeza dan cuba memuatkan nilai data.

Memandangkan operasi penugasan kepada data bukan atom, persaingan data mungkin berlaku dalam persekitaran serentak. Dalam contoh di atas, 10 atau 20 boleh dicetak, bergantung pada susunan kedua-dua goroutine itu dilaksanakan. Operasi penugasan bukan atom ini mungkin membawa kepada isu keselamatan serentak, jadi anda perlu mengendalikannya dengan berhati-hati apabila menggunakan pembolehubah jenis rujukan.

Untuk memastikan pembolehubah jenis rujukan yang serentak dan selamat, kunci mutex atau primitif penyegerakan boleh digunakan untuk beroperasi. Berikut ialah contoh menggunakan mutex untuk melaksanakan tugasan selamat serentak:

package main

import (
    "fmt"
    "sync"
)

type Data struct {
    Num int
}

func main() {
    var mutex sync.Mutex
    var data *Data

    mutex.Lock()
    data = &Data{Num: 10}
    mutex.Unlock()

    go func() {
        mutex.Lock()
        data = &Data{Num: 20}
        mutex.Unlock()
    }()

    go func() {
        mutex.Lock()
        fmt.Println(data.Num)
        mutex.Unlock()
    }()

    // 主线程等待其他goroutine执行完毕
    time.Sleep(time.Second)
}

Dalam contoh di atas, kami menggunakan jenis Mutex bagi pakej penyegerakan untuk melaksanakan mutex. Kami mencipta kunci mutex dalam benang utama dan menggunakan kaedah Kunci dan Buka Kunci untuk melindungi penetapan data. Dalam goroutine serentak, kami juga menggunakan kaedah Kunci dan Buka Kunci untuk melindungi operasi membaca data. Melalui penggunaan kunci mutex, kami dapat memastikan keatoman operasi penetapan kepada data, dengan itu mengelakkan masalah persaingan data.

Ringkasnya, tidak semua operasi penugasan pembolehubah di Golang adalah atom. Operasi penugasan pembolehubah jenis asas adalah atom, tetapi operasi penugasan pembolehubah jenis rujukan bukan atom. Dalam persekitaran serentak, operasi penugasan kepada pembolehubah jenis rujukan boleh menyebabkan masalah perlumbaan data, jadi mekanisme penyegerakan yang sesuai perlu diguna pakai untuk memastikan keselamatan serentak.

Atas ialah kandungan terperinci Bincangkan isu atomicity bagi pembolehubah tugasan di Golang. 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