Mengapa Rutin Pergi Saya Mencetak Nilai Tidak Dijangka Kerana Susunan Semula Memori?

Susan Sarandon
Lepaskan: 2024-11-23 06:58:17
asal
431 orang telah melayarinya

Why Does My Go Routine Print Unexpected Values Due to Memory Reordering?

Isu Pergi Rutin: Penyegerakan Tidak Betul

Isu yang anda hadapi dalam GoLang berpunca daripada model ingatannya. Mengikut dokumentasi, dalam satu goroutine, membaca dan menulis boleh disusun semula selagi ia tidak menjejaskan gelagat dalam goroutine tersebut.

Pertimbangkan kod ini:

var a, b int

func f() {
    a = 1
    b = 2
}

func g() {
    print(b)
    print(a)
}

func main() {
    go f()
    g()
}
Salin selepas log masuk

Disebabkan kepada penyusunan semula model memori, anda mungkin melihat bahawa g() mencetak 2 dan kemudian 0. Walaupun tugasan a datang sebelum b masuk f(), pengkompil boleh mengoptimumkan kod dengan menetapkan b terlebih dahulu atas sebab kecekapan.

Dalam goroutine yang sama, susunan tugasan dijamin, kerana pengkompil tidak boleh menyusunnya semula jika ia akan menyebabkan masalah. Walau bagaimanapun, dalam contoh yang diberikan, tiada penyegerakan antara kedua-dua goroutine. Oleh itu, pengkompil tidak perlu mempertimbangkan potensi kesan penyusunan semula pada goroutine yang lain.

Jika anda memperkenalkan penyegerakan antara goroutine, seperti WaitGroup atau mutex, pengkompil akan memastikan tiada ketidakkonsistenan di titik penyegerakan. Dalam kes ini, anda menjangkakan g() mencetak 2 dan 1, kerana kedua-dua tugasan akan diselesaikan sebelum panggilan print() dipanggil.

Memahami aspek model ingatan GoLang ini adalah penting untuk menulis atur cara serentak dan mengelakkan keadaan perlumbaan yang berpotensi atau isu lain yang mungkin timbul akibat penyusunan semula yang tidak dijangka.

Atas ialah kandungan terperinci Mengapa Rutin Pergi Saya Mencetak Nilai Tidak Dijangka Kerana Susunan Semula Memori?. 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