Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Operasi Baca dan Tulis serentak pada Go Structs Boleh Dilaksanakan dengan Selamat?
Dalam kod yang disediakan, dua fungsi diperkenalkan: concurrentStruct() dan concurrentStructWithMuLock (). Kedua-dua fungsi membaca dan menulis struct serentak, tetapi yang pertama melakukannya tanpa kunci dan menjana amaran perlumbaan. Sebaliknya, yang terakhir menggunakan mutex baca-tulis untuk menyegerakkan akses, menyebabkan tiada amaran perlumbaan.
Seperti yang ditunjukkan oleh mesej ralat, perlumbaan data berlaku apabila:
Dalam concurrentStruct(), situasi ini timbul kerana medan utama struct Metadata diakses dan diubah suai oleh berbilang goroutine tanpa sebarang penyegerakan.
Walaupun concurrentStruct() tidak menggunakan kunci, penggunaan goroutin tanpa nama berjalan tanpa had membawa kepada keadaan perlumbaan yang berpotensi. Goruti ini terus membaca, mengubah suai dan menulis medan utama tanpa mengambil kira tindakan gorouti lain.
Berbeza dengan concurrentStruct(), concurrentStructWithMuLock() menggunakan read -tulis mutex untuk menyegerakkan akses kepada medan kunci. Ini memastikan pengecualian bersama, menghalang berbilang goroutine daripada mengubah suai medan secara serentak. Akibatnya, tiada keadaan perlumbaan berlaku dan fungsi berjalan tanpa amaran.
Fungsi concurrentMap() menunjukkan jenis keadaan perlumbaan yang berbeza yang melibatkan peta Go . Walaupun peta selamat untuk benang dalam Go, akses serentak ke peta untuk kedua-dua bacaan dan tulis tanpa penyegerakan yang betul boleh membawa kepada ralat yang membawa maut. Masa jalanan Go termasuk pengesan perlumbaan data yang ringan, yang merosakkan atur cara apabila ia mengesan akses yang tidak disegerakkan kepada peta sebagai perlindungan terhadap tingkah laku yang tidak ditentukan.
Atas ialah kandungan terperinci Bagaimanakah Operasi Baca dan Tulis serentak pada Go Structs Boleh Dilaksanakan dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!