Kunci dan mutex terbina dalam dalam bahasa Go
Dengan populariti pemproses berbilang teras, pengaturcaraan berbilang benang telah menjadi bahagian yang amat diperlukan dalam pembangunan aplikasi. Dalam pengaturcaraan berbilang benang, kunci ialah mekanisme penting yang digunakan untuk mengawal akses serentak kepada sumber yang dikongsi. Bahasa Go menyediakan banyak mekanisme penguncian, yang paling biasa digunakan ialah kunci terbina dalam dan mutex.
Bawa kunci anda sendiri
Bawa kunci anda sendiri ialah mekanisme kunci dalam bahasa Go, yang ringan, mudah digunakan dan berprestasi tinggi. Kunci terbina dalam ialah pembolehubah dengan syarat persaingan Iaitu, apabila mengakses sumber yang dikongsi secara serentak, jika beberapa utas mengakses pembolehubah pada masa yang sama, keadaan persaingan akan berlaku untuk mengelakkan hasil yang tidak konsisten.
Dalam bahasa Go, operasi penyegerakan boleh dilakukan dengan mudah menggunakan kunci terbina dalam. Kunci terbina dalam mempunyai dua kaedah penting, Kunci() dan Buka Kunci() Kaedah Kunci() digunakan untuk memperoleh kunci Jika kunci sudah diduduki oleh utas lain, utas panggilan akan memasuki keadaan menyekat dan menunggu untuk kunci dilepaskan; Kaedah Unlock() digunakan untuk melepaskan kunci.
Contoh penggunaan kunci terbina dalam:
var mu sync.Mutex // 定义一个锁变量 var count int func main() { for i := 0; i < 1000; i++ { go add() // 启动1000个线程,对count进行加1操作 } time.Sleep(time.Second) // 等待所有线程执行完成 fmt.Println(count) // 打印最终结果 } func add() { mu.Lock() // 获取锁 count++ // 对共享变量进行操作 mu.Unlock() // 释放锁 }
Dalam kod di atas, kiraan pembolehubah global digunakan sebagai sumber dikongsi dan ia ditambah sebanyak 1 dengan memulakan 1000 utas. Untuk memastikan akses serentak kepada pembolehubah kiraan tidak menyebabkan keadaan perlumbaan, kunci terbina dalam digunakan untuk penyegerakan. Dalam fungsi add(), mula-mula panggil kaedah mu.Lock() untuk memperoleh kunci, kendalikan sumber yang dikongsi, dan kemudian lepaskan kunci melalui kaedah mu.Unlock(). Ini memastikan bahawa operasi pada pembolehubah kiraan adalah atom dan mengelakkan keadaan perlumbaan.
Mutex
Mutex ialah satu lagi mekanisme penguncian dalam bahasa Go, yang juga digunakan untuk melindungi sumber kongsi. Mutex adalah serupa dengan kunci terbina dalam dan boleh digunakan untuk menghalang keadaan perlumbaan daripada berlaku, tetapi sebagai perbandingan, mutex boleh mengunci dan membuka kunci operasi pada blok kod yang lebih halus.
Penggunaan mutex adalah serupa dengan kuncinya sendiri. Dalam bahasa Go, jenis mutex ialah sync.Mutex, dan prototaip adalah seperti berikut:
type Mutex struct { // 包含Mutex的内部结构 } func (m *Mutex) Lock() { // 加锁操作 } func (m *Mutex) Unlock() { // 解锁操作 }
Apabila menggunakan mutex, anda juga perlu menambah kod yang memerlukan penyegerakan antara Lock() dan Unlock( ) kaedah untuk memastikan ketepatan sumber yang dikongsi.
Contoh penggunaan mutex:
var mu sync.Mutex // 定义一个互斥量 var count int func main() { for i := 0; i < 1000; i++ { go add() // 启动1000个线程,对count进行加1操作 } time.Sleep(time.Second) // 等待所有线程执行完成 fmt.Println(count) // 打印最终结果 } func add() { mu.Lock() // 获取锁 count++ // 对共享变量进行操作 mu.Unlock() // 释放锁 }
Sama seperti penggunaan kunci terbina dalam, mutex digunakan dalam kod di atas untuk menyegerakkan akses kepada kiraan sumber yang dikongsi.
Ringkasan
Kunci dan mutex terbina dalam ialah mekanisme penyegerakan biasa dalam bahasa Go, digunakan untuk melindungi sumber kongsi daripada pengubahsuaian serentak. Kunci terbina dalam sesuai untuk mengunci dan membuka kunci operasi pada keseluruhan blok kod, manakala mutex boleh digunakan untuk mengunci dan membuka kunci operasi pada blok kod yang lebih halus. Dalam pembangunan sebenar, mekanisme kunci yang sesuai harus dipilih mengikut keperluan khusus untuk memastikan kebolehpercayaan dan keselarasan program.
Atas ialah kandungan terperinci Kunci dan mutex terbina dalam dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!