Keselamatan fungsi Golang dan mekanisme penyegerakan dalam persekitaran serentak

PHPz
Lepaskan: 2024-06-04 15:37:01
asal
521 orang telah melayarinya

Keselamatan fungsi: keselamatan goroutine: Ia boleh dipanggil dengan selamat dalam goroutin serentak. Keselamatan bukan goroutine: mengakses keadaan kongsi atau bergantung pada goroutine tertentu. Mekanisme penyegerakan: Mutex: melindungi akses serentak kepada sumber yang dikongsi. RWMutex: Membenarkan bacaan serentak dan hanya satu tulisan. Cond: Tunggu syarat tertentu untuk dipenuhi. WaitGroup: Tunggu sekumpulan goroutine selesai. Kes praktikal: Kaunter Concurrency menggunakan Mutex untuk melindungi keadaan kongsi dan memastikan ketepatan di bawah concurrency.

Golang 函数在并发环境中的安全性和同步机制

Mekanisme keselamatan dan penyegerakan Go berfungsi dalam persekitaran serentak

Dalam persekitaran serentak Go, adalah penting untuk memahami keselamatan fungsi dan mekanisme penyegerakan yang betul. Artikel ini akan meneroka konsep ini dan menunjukkannya melalui kes praktikal.

Keselamatan fungsi

  • keselamatan goroutine: Sesuatu fungsi dikatakan selamat goroutine jika ia boleh dipanggil dengan selamat daripada goroutin serentak. Ini bermakna ia tidak mengubah suai pembolehubah global atau keadaan dikongsi, dan ia tidak bersaing dengan gorout lain.
  • Selamat bukan goroutine: Fungsi adalah selamat bukan goroutine jika ia mengakses atau mengubah keadaan kongsi, atau bergantung pada goroutine tertentu yang dijalankan.

Mekanisme penyegerakan

Untuk memastikan ketekalan data dan mengelakkan persaingan dalam persekitaran serentak, mekanisme penyegerakan perlu digunakan. Go menyediakan beberapa jenis penyegerakan terbina dalam:

  • Mutex: Mutex, digunakan untuk melindungi akses serentak kepada sumber yang dikongsi.
  • RWMutex: Baca-tulis mutex, membenarkan bacaan serentak tetapi hanya menulis pada satu masa.
  • Cond: Condition variable, digunakan untuk menunggu syarat tertentu dipenuhi.
  • WaitGroup: Waiting group, biasa tunggu kumpulan goroutine siap.

Kes Praktikal: Kaunter Concurrency

Pertimbangkan contoh kaunter concurrency. Ia adalah nilai yang disimpan dalam pembolehubah selamat goroutine yang boleh ditambah secara selari. Untuk memastikan ketepatan pembilang di bawah konkurensi, mekanisme penyegerakan perlu digunakan.

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

var (
    cnt int64        // 原子计数器
    mu sync.Mutex   // 互斥锁
)

func main() {
    wg := &sync.WaitGroup{}

    // 并发增量计数器
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            mu.Lock()
            cnt++
            mu.Unlock()
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println("最终计数:", cnt)
}
Salin selepas log masuk

Dalam contoh ini, kami mempunyai akses serentak ke kaunter cnt 声明为原子变量以确保并发的安全增量。使用 mutex mu 来保护对 cnt untuk mengelakkan keadaan perlumbaan.

Menjalankan program ini akan mengeluarkan:

最终计数: 10
Salin selepas log masuk

Ini mengesahkan bahawa kaunter dinaikkan dengan betul 10 kali secara selari.

Atas ialah kandungan terperinci Keselamatan fungsi Golang dan mekanisme penyegerakan dalam persekitaran serentak. 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!