Rumah >pembangunan bahagian belakang >Golang >Mengapa Nilai Goroutine Saya Tidak Kelihatan kepada Orang Lain?

Mengapa Nilai Goroutine Saya Tidak Kelihatan kepada Orang Lain?

Linda Hamilton
Linda Hamiltonasal
2024-10-29 11:37:30694semak imbas

Why Is My Goroutine's Value Not Visible to Others?

Adakah ini kerana pengkompil go mengoptimumkan kod?

Isunya bukanlah pengoptimuman oleh pengkompil Go, sebaliknya kekurangan penyegerakan. Tugasan kepada i tidak diikuti oleh sebarang peristiwa penyegerakan, jadi ia tidak dijamin untuk diperhatikan oleh mana-mana goroutine lain. Malah, pengkompil yang agresif mungkin memadamkan keseluruhan penyataan i.

Model Memori Go

Model memori Go menentukan keadaan di mana pembacaan pembolehubah dalam satu goroutine boleh dijamin untuk memerhati nilai yang dihasilkan dengan menulis kepada pembolehubah yang sama dalam goroutine yang berbeza.

Untuk menyerikan akses, lindungi data dengan operasi saluran atau primitif penyegerakan lain seperti yang terdapat dalam penyegerakan dan penyegerakan/pakej atom .

Jika anda mesti membaca seluruh dokumen ini untuk memahami tingkah laku program anda, anda terlalu bijak. Jangan pandai.

Penyegerakan

Dalam contoh berikut, tugasan kepada a tidak diikuti oleh sebarang peristiwa penyegerakan, jadi ia tidak dijamin untuk dipatuhi oleh mana-mana goroutine lain. Malah, pengkompil yang agresif mungkin memadamkan keseluruhan pernyataan go.

<code class="go">var a string

func hello() {
  go func() { a = "hello" }()
  print(a)
}</code>

Contoh berikut menunjukkan cara mensiri akses kepada i menggunakan penyegerakan.Mutex.

<code class="go">package main

import (
    "sync"
    "time"
)

func main() {
    mx := new(sync.Mutex)
    i := 1
    go func() {
        for {
            mx.Lock()
            i++
            mx.Unlock()
        }
    }()
    <-time.After(1 * time.Second)
    mx.Lock()
    println(i)
    mx.Unlock()
}</code>

Atas ialah kandungan terperinci Mengapa Nilai Goroutine Saya Tidak Kelihatan kepada Orang Lain?. 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