Kunci dan mutex terbina dalam dalam bahasa Go

王林
Lepaskan: 2023-06-01 08:06:26
asal
695 orang telah melayarinya

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()  // 释放锁
}
Salin selepas log masuk

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() {
    // 解锁操作
}
Salin selepas log masuk

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()  // 释放锁
}
Salin selepas log masuk

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!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!