Tugasan Pembolehubah dalam Go: Adakah Ia Atom?
Dalam Go, pengubahsuaian serentak data dikongsi oleh berbilang goroutin boleh membawa kepada gelagat yang tidak dijangka. Pertimbangkan senario di mana dua utas secara serentak cuba mengubah suai medan rentetan struktur.
Soalan:
Jika dua utas secara serentak menetapkan rentetan yang berbeza kepada medan rentetan yang sama, adakah nilai medan yang terhasil sentiasa menjadi satu atau rentetan lain yang ditetapkan?
Jawapan:
Tidak. Dalam Go, tugasan pembolehubah bukan atom. Oleh itu, pengubahsuaian serentak pembolehubah yang dikongsi boleh mengakibatkan keadaan yang tidak dijangka. Seperti yang dinyatakan dalam dokumen Model Memori Go:
Program yang mengubah suai data yang diakses secara serentak oleh berbilang
goroutines mesti menyerikan akses sedemikian.
Penyelesaian:
Untuk memastikan operasi atom, Go menyediakan primitif penyegerakan dalam pakej penyegerakan dan penyegerakan/atom. Contohnya, jenis sync.Mutex boleh digunakan untuk menyegerakkan akses kepada data yang dikongsi, memastikan hanya satu goroutine boleh mengubah suainya pada satu masa.
Cadangan:
Apabila berurusan dengan akses serentak kepada data yang dikongsi, anda dinasihatkan untuk menggunakan mekanisme penyegerakan yang sesuai seperti saluran atau primitif penyegerakan untuk menyerikan akses dan mencegah rasuah data.
Atas ialah kandungan terperinci Adakah Pembolehubah Tugasan dalam Go Atomic?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!