Go ialah bahasa pengaturcaraan sumber terbuka yang menggunakan model pengaturcaraan serentak untuk mengendalikan pelaksanaan berselang-seli berbilang tugas. Dalam pengaturcaraan serentak, ia selalunya melibatkan berbilang coroutine atau utas yang mengakses sumber yang dikongsi pada masa yang sama Dalam kes ini, kunci mutex perlu digunakan untuk memastikan keeksklusifan sumber dan mengelakkan berlakunya keadaan perlumbaan.
Dalam bahasa Go, pakej sync
disediakan untuk melaksanakan pelbagai primitif penyegerakan, termasuk kunci mutex. Jenis sync.Mutex
ialah jenis kunci mutex yang paling asas Ia melaksanakan akses yang saling eksklusif kepada sumber melalui dua kaedah: Lock
dan Unlock
. sync
包来实现各种同步原语,其中就包括互斥锁。sync.Mutex
类型是最基本的互斥锁类型,它通过两个方法Lock
和Unlock
来实现资源的互斥访问。
下面我们来具体看一下sync.Mutex
的使用。
package main import ( "fmt" "sync" "time" ) var count int var mutex sync.Mutex func increment() { mutex.Lock() // 加锁 defer mutex.Unlock() // 解锁,在函数执行完毕后自动调用 count++ } func main() { for i := 0; i < 10; i++ { go increment() } time.Sleep(time.Second) // 等待所有协程执行完毕 fmt.Println("count:", count) }
在上面的代码中,首先定义了一个全局变量count
用来记录计数器的值,然后定义了一个sync.Mutex
类型的互斥锁mutex
。在increment
函数中,通过调用mutex.Lock()
来获得互斥锁,保证只有一个协程能够进入临界区执行count++
操作,然后调用mutex.Unlock()
来释放互斥锁,让其他协程可以继续竞争执行。
在main
函数中,通过循环创建了10个协程,每个协程都调用increment
函数来增加计数器的值。为了保证所有协程都执行完毕,我们使用time.Sleep
函数来让主协程等待1秒钟。
最后,我们将计数器的值打印出来,可以看到正确输出了count: 10
。
使用互斥锁可以保证共享资源的安全访问,避免了数据竞态的发生。在多个协程或线程访问共享资源时,使用互斥锁是非常重要的。Go语言的sync.Mutex
sync.Mutex
. #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, pembolehubah global count
pertama kali ditakrifkan untuk merekodkan nilai pembilang, dan kemudian sync.Mutex
ialah ditakrifkan kunci Mutex jenis mutex
. Dalam fungsi increment
, dapatkan kunci mutex dengan memanggil mutex.Lock()
untuk memastikan bahawa hanya satu coroutine boleh memasuki bahagian kritikal untuk melaksanakan count++
operasi, dan kemudian panggil mutex.Unlock()
untuk melepaskan kunci mutex supaya coroutine lain boleh terus bersaing untuk pelaksanaan. #🎜🎜##🎜🎜#Dalam fungsi utama
, 10 coroutine dicipta melalui gelung, dan setiap coroutine memanggil fungsi increment
untuk meningkatkan nilai kaunter. Untuk memastikan semua coroutine dilaksanakan, kami menggunakan fungsi time.Sleep
untuk membuat coroutine utama menunggu selama 1 saat. #🎜🎜##🎜🎜#Akhir sekali, kami mencetak nilai pembilang, dan kami dapat melihat bahawa sync.Mutex
bahasa Go menyediakan fungsi kunci mutex yang ringkas dan berkuasa, menjadikan pengaturcaraan serentak lebih mudah dan selamat. #🎜🎜#Atas ialah kandungan terperinci Analisis dokumen bahasa Go: sync.Fungsi Mutex melaksanakan kunci mutex. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!