Rumah > pembangunan bahagian belakang > Golang > Kunci aplikasi dalam pengaturcaraan serentak dalam bahasa Go

Kunci aplikasi dalam pengaturcaraan serentak dalam bahasa Go

王林
Lepaskan: 2024-03-24 10:21:03
asal
641 orang telah melayarinya

Kunci aplikasi dalam pengaturcaraan serentak dalam bahasa Go

Bahasa Go ialah bahasa pengaturcaraan sumber terbuka yang asalnya dibangunkan oleh Google untuk meningkatkan kecekapan pengaturcara dan prestasi sistem. Bahasa Go menyokong pengaturcaraan serentak, yang bermaksud melaksanakan berbilang tugas pada masa yang sama Penggunaan kunci adalah cara biasa untuk memastikan keselamatan serentak. Dalam artikel ini, kami akan meneroka cara menggunakan kunci dalam bahasa Go untuk memastikan ketepatan program serentak dan memberikan contoh kod khusus.

Mengapa kunci diperlukan

Dalam pengaturcaraan serentak, apabila berbilang goroutin (benang ringan dalam bahasa Go) mengakses pembolehubah atau sumber yang dikongsi pada masa yang sama, keadaan perlumbaan (Keadaan Perlumbaan) mungkin berlaku. Keadaan perlumbaan boleh membawa kepada ketidakkonsistenan data dan juga ranap program. Untuk mengelakkan situasi ini daripada berlaku, kita perlu menggunakan kunci untuk mengawal dan melindungi sumber yang dikongsi.

Mutex (Mutex)

Mutex ialah jenis kunci yang paling biasa Mutex boleh memastikan bahawa hanya satu goroutine boleh mengakses sumber yang dikongsi pada masa yang sama. Dalam bahasa Go, anda boleh menggunakan jenis Mutex dalam pakej sync untuk melaksanakan kunci mutex. sync包中的Mutex类型来实现互斥锁。

下面是一个简单的示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    balance int
    mu      sync.Mutex
)

func deposit(amount int) {
    mu.Lock()
    defer mu.Unlock()
    balance += amount
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            deposit(10)
            wg.Done()
        }()
    }
    wg.Wait()

    fmt.Println("Final balance:", balance)
}
Salin selepas log masuk

在上面的代码中,我们定义了一个全局变量balance表示账户余额,以及一个互斥锁mu用来保护balance的访问。deposit函数负责向账户中存入金额,在存款过程中需要先调用mu.Lock()进行加锁,操作完成后再调用mu.Unlock()进行解锁。

main函数中启动1000个goroutine并发执行存款操作,通过sync.WaitGroup来等待所有goroutine执行完毕,最后打印出最终的账户余额。

读写锁(RWMutex)

除了互斥锁以外,Go语言也提供了读写锁(RWMutex)来实现读多写少的场景。读写锁允许多个goroutine同时读取共享资源,但在有写操作时会阻塞所有的读操作。

下面是一个使用读写锁的示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    data map[string]string
    mu   sync.RWMutex
)

func readData(key string) string {
    mu.RLock()
    defer mu.RUnlock()
    return data[key]
}

func writeData(key, value string) {
    mu.Lock()
    defer mu.Unlock()
    data[key] = value
}

func main() {
    data = make(map[string]string)
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            for j := 0; j < 1000; j++ {
                key := fmt.Sprintf("key%d", j)
                value := fmt.Sprintf("value%d", j)
                writeData(key, value)
                fmt.Println(readData(key))
            }
            wg.Done()
        }()
    }
    wg.Wait()
}
Salin selepas log masuk

在上面的代码中,我们定义了一个data变量作为共享的数据存储,以及一个读写锁mu用来保护对data的并发访问。readData函数用于读取指定key的数据,调用mu.RLock()进行读锁定;writeData函数用于写入key-value数据,调用mu.Lock()进行写锁定。

main函数中启动100个goroutine并发执行读写操作,并通过fmt.Println

Berikut ialah contoh kod mudah:

rrreee

Dalam kod di atas, kami mentakrifkan pembolehubah global baki untuk mewakili baki akaun dan kunci mutex mu Digunakan untuk melindungi akses kepada balance. Fungsi deposit bertanggungjawab untuk mendepositkan amaun ke dalam akaun Semasa proses deposit, anda perlu memanggil mu.Lock() terlebih dahulu untuk mengunci, dan kemudian memanggil mu selepas operasi selesai Unlock()Unlock. <p></p>Dalam fungsi <code>utama, mulakan 1000 gorout untuk melaksanakan operasi deposit secara serentak, tunggu semua gorout selesai pelaksanaan melalui sync.WaitGroup, dan akhirnya mencetak baki akaun akhir . 🎜🎜Kunci baca-tulis (RWMutex)🎜🎜Selain kunci mutex, bahasa Go juga menyediakan kunci baca-tulis (RWMutex) untuk mencapai senario di mana lebih banyak pembacaan dilakukan dan kurang penulisan dilakukan. Kunci baca-tulis membenarkan berbilang gorout membaca sumber yang dikongsi pada masa yang sama, tetapi akan menyekat semua operasi baca apabila terdapat operasi tulis. 🎜🎜Berikut ialah contoh kod menggunakan kunci baca-tulis: 🎜rrreee🎜Dalam kod di atas, kami mentakrifkan pembolehubah data sebagai storan data kongsi dan kunci baca-tulis mu Digunakan untuk melindungi akses serentak kepada data. Fungsi readData digunakan untuk membaca data kekunci yang ditentukan dan memanggil mu.RLock() untuk penguncian baca ialah fungsi writeData; digunakan untuk menulis data nilai kunci, panggil mu.Lock() untuk mengunci tulis. 🎜🎜Dalam fungsi utama, mulakan 100 gorout untuk melaksanakan operasi baca dan tulis secara serentak, dan cetak setiap data baca melalui fmt.Println. Menggunakan kunci baca-tulis boleh meningkatkan prestasi konkurensi program dan memastikan operasi membaca data tidak disekat oleh operasi menulis. 🎜🎜Ringkasan🎜🎜Melalui pengenalan artikel ini, kami memahami kepentingan menggunakan kunci dalam pengaturcaraan serentak dalam bahasa Go, dan cara menggunakan kunci mutex dan kunci baca-tulis untuk melindungi sumber yang dikongsi dan mengelakkan keadaan perlumbaan. Dalam pembangunan sebenar, penggunaan kunci yang munasabah boleh meningkatkan prestasi serentak program dan memastikan ketepatan program. Saya harap artikel ini dapat membantu pembaca lebih memahami aplikasi kunci dalam pengaturcaraan serentak dalam bahasa Go. 🎜

Atas ialah kandungan terperinci Kunci aplikasi dalam pengaturcaraan serentak dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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