cari
Rumahpembangunan bahagian belakangGolangKunci aplikasi dalam pengaturcaraan serentak dalam bahasa Go

Kunci aplikasi dalam pengaturcaraan serentak dalam bahasa Go

Mar 24, 2024 am 10:21 AM
gopergi bahasaKunciserentakakses serentak

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)
}

在上面的代码中,我们定义了一个全局变量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()
}

在上面的代码中,我们定义了一个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!

Kenyataan
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
Golang vs Python: Konvensyen dan MultithreadingGolang vs Python: Konvensyen dan MultithreadingApr 17, 2025 am 12:20 AM

Golang lebih sesuai untuk tugas -tugas kesesuaian yang tinggi, sementara Python mempunyai lebih banyak kelebihan dalam fleksibiliti. 1.Golang dengan cekap mengendalikan kesesuaian melalui goroutine dan saluran. 2. Pilihannya harus berdasarkan keperluan khusus.

Golang dan C: Perdagangan dalam prestasiGolang dan C: Perdagangan dalam prestasiApr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Golang vs Python: Aplikasi dan Kes GunakanGolang vs Python: Aplikasi dan Kes GunakanApr 17, 2025 am 12:17 AM

PilihgolangforhighperformanceandConcurrency, IdealForBackEndServicesandnetworkprogramming; SelectPythonForrapidDevelopment, datascience, danMachinelearningDuetoitSversativilityAndextiveLibraries.

Golang vs Python: Perbezaan dan Persamaan UtamaGolang vs Python: Perbezaan dan Persamaan UtamaApr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Golang vs Python: Kemudahan Penggunaan dan Keluk PembelajaranGolang vs Python: Kemudahan Penggunaan dan Keluk PembelajaranApr 17, 2025 am 12:12 AM

Dalam apa aspek Golang dan Python lebih mudah digunakan dan mempunyai lengkung pembelajaran yang lebih lancar? Golang lebih sesuai untuk kesesuaian tinggi dan keperluan prestasi tinggi, dan lengkung pembelajaran agak lembut untuk pemaju dengan latar belakang bahasa C. Python lebih sesuai untuk sains data dan prototaip cepat, dan lengkung pembelajaran sangat lancar untuk pemula.

Perlumbaan Prestasi: Golang vs CPerlumbaan Prestasi: Golang vs CApr 16, 2025 am 12:07 AM

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golang vs C: Contoh kod dan analisis prestasiGolang vs C: Contoh kod dan analisis prestasiApr 15, 2025 am 12:03 AM

Golang sesuai untuk pembangunan pesat dan pengaturcaraan serentak, manakala C lebih sesuai untuk projek yang memerlukan prestasi yang melampau dan kawalan asas. 1) Model Concurrency Golang memudahkan pengaturcaraan konvensyen melalui goroutine dan saluran. 2) Pengaturcaraan templat C menyediakan kod generik dan pengoptimuman prestasi. 3) Koleksi sampah Golang adalah mudah tetapi boleh menjejaskan prestasi. Pengurusan memori C adalah rumit tetapi kawalannya baik -baik saja.

Impak Golang: Kelajuan, Kecekapan, dan KesederhanaanImpak Golang: Kelajuan, Kecekapan, dan KesederhanaanApr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivielythroughspeed, efficiency, andsimplicity.1) Speed: goCompilesquicklyandrunsefficiently, idealforlargeproject.2) Kecekapan: ITSComprehensivestandardlibraryraryrarexternaldependencies, enhingdevelyficiency.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft