Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah output program Go saya sentiasa 1 apabila goroutine serentak menambah pembolehubah kongsi?

Mengapakah output program Go saya sentiasa 1 apabila goroutine serentak menambah pembolehubah kongsi?

Susan Sarandon
Susan Sarandonasal
2024-10-31 01:36:29623semak imbas

Why is the output of my Go program always 1 when a concurrent goroutine is incrementing a shared variable?

Adakah ini kerana pengkompil go mengoptimumkan kod?

Dalam kod Go yang disediakan, pembolehubah i dikongsi antara goroutine utama dan goroutine serentak dicipta menggunakan go func() { ... }(). Tujuan goroutine serentak adalah untuk menambah i selama-lamanya. Walau bagaimanapun, semasa menjalankan program, anda mendapati bahawa output sentiasa 1, walaupun menjangkakan jumlah yang lebih besar memandangkan goroutine serentak mempunyai masa yang mencukupi untuk menambah i berkali-kali.

Untuk memahami tingkah laku ini, kita perlu pertimbangkan Model Memori Go dan pengoptimuman pengkompil.

Model Memori Go

Model Memori Go menentukan syarat di mana bacaan pembolehubah dalam satu goroutine boleh dijamin untuk memerhati nilai yang dihasilkan dengan menulis kepada pembolehubah yang sama dalam goroutine yang berbeza.

Menurut Model Memori Go, untuk perubahan pada pembolehubah yang dikongsi dapat dilihat merentasi goroutine, mereka mesti diikuti dengan acara penyegerakan, seperti operasi saluran atau mengunci mutex.

Pengoptimuman Pengkompil

Dalam contoh anda, tugasan kepada i dalam goroutine serentak tidak diikuti oleh sebarang peristiwa penyegerakan. Akibatnya, tugasan tidak dijamin dipatuhi oleh goroutine utama, dan pengkompil bebas untuk mengoptimumkan kod mengikut kesesuaian.

Pengkompil yang agresif mungkin mengoptimumkan kod dengan menghapuskan operasi kenaikan sepenuhnya , dengan berkesan mengurangkan goroutine serentak kepada gelung tak terhingga yang tidak melakukan apa-apa. Pengoptimuman ini akan menerangkan sebab output sentiasa 1, kerana goroutine utama tidak pernah melihat kenaikan yang dilakukan oleh goroutine serentak.

Untuk memastikan kemas kini kepada pembolehubah dikongsi disebarkan dengan betul merentas goroutine, adalah penting untuk menyegerakkan akses kepada pembolehubah tersebut menggunakan saluran, mutex atau primitif penyegerakan lain yang disediakan oleh penyegerakan dan pakej penyegerakan/atom Go.

Atas ialah kandungan terperinci Mengapakah output program Go saya sentiasa 1 apabila goroutine serentak menambah pembolehubah kongsi?. 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