Terokai ciri-ciri keatoman tugasan pembolehubah Golang

WBOY
Lepaskan: 2024-01-18 09:47:05
asal
510 orang telah melayarinya

. tiada satu pun pelaksanaan berlaku. Golang menyediakan beberapa operasi atom, seperti fungsi operasi atom dalam pakej atom, yang boleh digunakan untuk memastikan keatoman operasi penetapan pembolehubah.

Artikel ini akan meneroka ketumpatan tugasan pembolehubah di Golang dan menunjukkan serta mengesahkannya melalui contoh kod khusus. Terokai ciri-ciri keatoman tugasan pembolehubah Golang

1. Fungsi operasi atom di Golang

Pakej atom Golang menyediakan satu siri fungsi operasi atom, yang paling biasa digunakan adalah seperti berikut:


atomic.AddInt32(&var, val): Tambahkan val secara atom pada nilai var dan mengembalikan nilai baharu.

atomic.AddInt64(&var, val): Menambahkan val secara atom pada nilai var dan mengembalikan nilai baharu.


atomic.AddUint32(&var, val): Menambahkan val secara atom pada nilai var dan mengembalikan nilai baharu.

    atomic.AddUint64(&var, val): Menambahkan val secara atom pada nilai var dan mengembalikan nilai baharu.
  1. atomic.LoadInt32(&var): Dapatkan nilai var secara atom dan kembalikan.
  2. atomic.LoadInt64(&var): Dapatkan nilai var secara atom dan kembalikan.
  3. atomic.LoadUint32(&var): Dapatkan nilai var secara atom dan kembalikannya.
  4. atomic.LoadUint64(&var): Dapatkan nilai var secara atom dan kembalikannya.
  5. atomic.StoreInt32(&var, val): Simpan val ke var secara atom.
  6. atomic.StoreInt64(&var, val): Simpan val ke var secara atom.
  7. atomic.StoreUint32(&var, val): Simpan val ke var secara atom.
  8. atomic.StoreUint64(&var, val): Simpan val ke var secara atom.
  9. 2. Contoh keatoman penetapan pembolehubah
  10. Yang berikut menggunakan contoh khusus untuk menggambarkan keatoman penetapan pembolehubah.
  11. package main
    
    import (
        "fmt"
        "sync"
        "sync/atomic"
    )
    
    var (
        count int32
        wg    sync.WaitGroup
    )
    
    func increaseCount() {
        for i := 0; i < 10000; i++ {
            atomic.AddInt32(&count, 1)
        }
        wg.Done()
    }
    
    func main() {
        wg.Add(2)
        go increaseCount()
        go increaseCount()
        wg.Wait()
        fmt.Println("Count: ", count)
    }
    Salin selepas log masuk
  12. Dalam kod di atas, kiraan pembolehubah global dan kumpulan menunggu wg ditakrifkan. Fungsi increaseCount melaksanakan operasi autokenaikan pada pembolehubah kiraan dengan menggunakan fungsi atomic.AddInt32, meningkat sebanyak 1 setiap kali. Dalam fungsi utama, dua goroutine dimulakan untuk melaksanakan fungsi increaseCount Setiap goroutine meningkat 10,000 kali, dan akhirnya mengeluarkan nilai kiraan melalui fmt.Println.
  13. Jalankan kod di atas dan hasilnya adalah seperti berikut:
Count: 20000
Salin selepas log masuk

Anda dapat melihat bahawa disebabkan penggunaan fungsi operasi atom atomic.AddInt32, keatoman operasi kenaikan automatik pada pembolehubah kiraan dijamin, dan keputusan yang betul akhirnya diperolehi.

3. Contoh tanpa jaminan atomicity

Mari kita lihat contoh tanpa jaminan atomicity.

package main

import (
    "fmt"
    "sync"
)

var (
    count int32
    wg    sync.WaitGroup
)

func increaseCount() {
    for i := 0; i < 10000; i++ {
        count += 1  // count的自增操作不是原子性的
    }
    wg.Done()
}

func main() {
    wg.Add(2)
    go increaseCount()
    go increaseCount()
    wg.Wait()
    fmt.Println("Count: ", count)
}
Salin selepas log masuk

Dalam kod di atas, kiraan += 1 operasi dalam fungsi increaseCount bukan atom, jadi keadaan perlumbaan mungkin berlaku semasa pelaksanaan serentak, mengakibatkan keputusan yang salah.

Jalankan kod di atas, hasilnya mungkin seperti berikut (hasilnya mungkin berbeza setiap kali):

Count:  15923
Salin selepas log masuk

Anda boleh melihat bahawa kerana atomicity operasi auto-increment kiraan tidak dijamin, keputusan akhir adalah salah.

4. Kesimpulan

Melalui contoh kod di atas, kita boleh membuat kesimpulan berikut:

Pakej atom dalam Golang menyediakan beberapa fungsi operasi atom, yang boleh digunakan untuk memastikan keatoman operasi penetapan pembolehubah.

Dalam pengaturcaraan serentak, menggunakan fungsi operasi atom boleh mengelakkan keadaan perlumbaan dan memastikan ketepatan data.


Ringkasan:
    Apabila menulis atur cara serentak, untuk memastikan atomicity operasi data, kita boleh menggunakan fungsi operasi atom dalam pakej atom yang disediakan oleh Golang. Fungsi ini boleh memastikan bahawa operasi pada pembolehubah yang dikongsi adalah atom, dengan itu mengelakkan berlakunya keadaan perlumbaan dan memastikan ketepatan data. Melalui contoh demonstrasi kod dalam artikel ini, pembaca boleh mempunyai pemahaman yang lebih mendalam tentang keatoman penugasan pembolehubah di Golang, dan secara rasional menggunakan fungsi operasi atom dalam pembangunan sebenar untuk meningkatkan kestabilan dan prestasi program.

Atas ialah kandungan terperinci Terokai ciri-ciri keatoman tugasan pembolehubah Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan