Rumah > pembangunan bahagian belakang > Golang > Mengapa Kod Goroutine Ini Menghasilkan Keputusan Yang Tidak Dijangka dan Bagaimana Perlumbaan Data Boleh Dielakkan?

Mengapa Kod Goroutine Ini Menghasilkan Keputusan Yang Tidak Dijangka dan Bagaimana Perlumbaan Data Boleh Dielakkan?

Linda Hamilton
Lepaskan: 2024-12-11 18:36:12
asal
483 orang telah melayarinya

Why Does This Goroutine Code Produce Unexpected Results and How Can Data Races Be Avoided?

Perlumbaan Data dalam Gelagat Goroutine

Coretan kod yang disediakan memperkenalkan isu perlumbaan data yang boleh membawa kepada hasil yang tidak dapat diramalkan. Isu teras berpunca daripada sifat Goroutines dan cara pembolehubah julat dihantar ke fungsi Goroutine.

Perlumbaan Data

Kod yang disediakan menggunakan julat gelung di atas kepingan data, dan untuk setiap lelaran, ia memulakan goroutine baharu untuk mencetak medan nama struct medan. Walau bagaimanapun, dalam setiap lelaran, pembolehubah julat v menunjuk kepada struktur data asas yang sama dalam kepingan data, yang merupakan rujukan.

Apabila gelung berkembang dan pembolehubah v berulang melalui kepingan data, nilainya berubah kepada tunjuk kepada elemen seterusnya. Ini bermakna apabila fungsi goroutine dilaksanakan, ia mempunyai nilai terakhir v, iaitu elemen terakhir dalam kepingan.

Oleh itu, pelaksanaan goroutine akan menghasilkan pencetakan medan nama bagi hanya elemen terakhir, "tiga," tiga kali bukannya "satu," "dua," "tiga" dalam mana-mana pesanan.

Penyelesaian

Untuk menyelesaikan isu ini, beberapa penyelesaian tersedia:

  1. Buat Pembolehubah Baharu :

    • Perkenalkan pembolehubah baharu v dalam lelaran gelung iaitu hanya diskop kepada lelaran itu. Ini memastikan bahawa setiap goroutine mempunyai versi v uniknya sendiri yang menunjuk kepada elemen yang betul dalam kepingan.
  2. Gunakan Sekeping Penunjuk:

    • Ubah suai kepingan data untuk menahan penunjuk kepada struct medan dan bukannya rujukan langsung. Dengan cara ini, setiap lelaran gelung mendapat penuding kepada elemen tertentu, menghapuskan masalah penggantian pembolehubah.
  3. Gunakan Alamat Elemen Slice:

    • Ambil secara eksplisit alamat elemen hirisan semasa gelung julat. Ini memberikan setiap goroutine alamat yang betul kepada elemen khusus dalam kepingan.

Pendekatan Tambahan

  • Lepaskan Argumen kepada Fungsi Tanpa Nama: Gunakan fungsi tanpa nama dalam goroutine untuk melepasi julat pembolehubah sebagai hujah. Ini memastikan bahawa setiap goroutine mempunyai akses kepada salinan unik pembolehubah julatnya sendiri.
  • Penerima Penunjuk: Kod menggunakan kaedah struct (field.print() ) dengan penerima penunjuk. Pelaksanaan ini biasanya memerlukan penggunaan sekeping penunjuk untuk sekeping data untuk mengelakkan isu.

Atas ialah kandungan terperinci Mengapa Kod Goroutine Ini Menghasilkan Keputusan Yang Tidak Dijangka dan Bagaimana Perlumbaan Data Boleh Dielakkan?. 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