Rumah >pembangunan bahagian belakang >Golang >Kesan prestasi mekanisme penyegerakan tersedia di Golang

Kesan prestasi mekanisme penyegerakan tersedia di Golang

王林
王林asal
2023-09-27 15:16:441396semak imbas

Kesan prestasi mekanisme penyegerakan tersedia di Golang

Impak mekanisme penyegerakan yang tersedia di Golang terhadap prestasi

Pengenalan:
Dalam pengaturcaraan serentak, mekanisme penyegerakan adalah penting untuk memastikan berbilang operasi serentak dilaksanakan dengan betul. Sebagai bahasa yang menyokong pengaturcaraan serentak, Golang menyediakan pelbagai mekanisme penyegerakan, seperti mutex (Mutex), kunci baca-tulis (RWLock), semaphore (Semaphore), pembolehubah keadaan (Cond), dll. Walau bagaimanapun, keseimbangan antara prestasi dan ketepatan program perlu ditimbang dengan teliti apabila menggunakan mekanisme penyegerakan ini.

1. Mutex (Mutex)
Mutex ialah salah satu mekanisme penyegerakan yang paling biasa Ia boleh melindungi kod dalam bahagian kritikal dan hanya membenarkan satu utas mengaksesnya pada masa yang sama. Berikut ialah kod sampel mudah:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mutex sync.Mutex
    wg    sync.WaitGroup
)

func increment() {
    defer wg.Done()
    mutex.Lock()
    defer mutex.Unlock()
    count++
}

func main() {
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment()
    }
    wg.Wait()
    fmt.Println("Count:", count)
}

Dalam kod di atas, akses serentak kepada pembolehubah kiraan dilindungi melalui kunci mutex. Dalam setiap goroutine, kunci diperoleh dengan memanggil kaedah Kunci dan kaedah Buka Kunci melepaskan kunci. Keputusan larian adalah betul dan nilai kiraan boleh dijamin 1000. Walau bagaimanapun, kunci mutex membawa overhed prestasi tambahan. Oleh kerana setiap kunci melibatkan panggilan sistem daripada sistem pengendalian, bertukar daripada mod pengguna kepada mod kernel, ini merupakan operasi yang agak mahal. Lock方法获取锁,Unlock方法释放锁。运行结果是正确的,可以保证count的值为1000。然而,互斥锁会带来额外的性能开销。因为每次加锁都会涉及到操作系统的系统调用,从用户态切换到内核态,这是一个较为昂贵的操作。

二、读写锁(RWLock)
读写锁是一种特殊的同步机制,它在互斥锁的基础上提供了更灵活的访问权限控制。读写锁允许多个读操作并发进行,而对写操作进行独占。下面是一个简单的示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    rw    sync.RWMutex
    wg    sync.WaitGroup
)

func increment() {
    defer wg.Done()
    rw.Lock()
    defer rw.Unlock()
    count++
}

func readCount() int {
    rw.RLock()
    defer rw.RUnlock()
    return count
}

func main() {
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment()
    }
    wg.Wait()
    fmt.Println("Count:", readCount())
}

上述代码中,我们使用读写锁来保护count变量的并发访问。通过调用RLock方法进行多个读操作,并调用Lock

2. Kunci baca-tulis (RWLock)

Kunci baca-tulis ialah mekanisme penyegerakan khas yang menyediakan kawalan akses yang lebih fleksibel berdasarkan kunci mutex. Kunci baca-tulis membenarkan berbilang operasi baca diteruskan secara serentak, manakala operasi menulis adalah eksklusif. Berikut ialah kod sampel mudah:

package main

import (
    "fmt"
)

var (
    count   int
    ch      = make(chan struct{}, 1)
    results = make(chan int, 1000)
)

func increment() {
    ch <- struct{}{} // 获取信号量
    count++
    results <- count
    <-ch // 释放信号量
}

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
    }
    for i := 0; i < 1000; i++ {
        <-results
    }
    fmt.Println("Count:", count)
}

Dalam kod di atas, kami menggunakan kunci baca-tulis untuk melindungi akses serentak kepada pembolehubah kiraan. Lakukan berbilang operasi baca dengan memanggil kaedah RLock dan panggil kaedah Lock untuk operasi tulis. Kunci baca-tulis boleh meningkatkan prestasi serentak program kerana berbilang goroutin dibenarkan membaca data pada masa yang sama dan operasi baca tidak saling eksklusif. Hanya apabila goroutine perlu melakukan operasi tulis, ia perlu dikunci. Untuk kebanyakan senario membaca dan menulis, kunci baca-tulis ialah pilihan yang baik.

3. Semaphore

Semaphore ialah mekanisme penyegerakan yang digunakan secara meluas dalam pengaturcaraan serentak Ia biasanya digunakan untuk mengawal akses kepada sumber kritikal. Pustaka standard Golang tidak menyediakan pelaksanaan semaphore asli, tetapi tingkah laku semaphore boleh disimulasikan melalui saluran yang digabungkan dengan goroutine. Berikut ialah kod sampel:
rrreee

Dalam kod di atas, kami melaksanakan mekanisme semaphore melalui saluran buffer. Memperoleh dan melepaskan semaphore dengan menghantar dan menerima data ke saluran. Menggunakan semaphore boleh mengawal sumber kritikal secara fleksibel dan mengehadkan bilangan goroutine yang mengakses sumber pada masa yang sama. 🎜🎜Ringkasan: 🎜Dalam pengaturcaraan serentak, mekanisme penyegerakan amat diperlukan. Memilih mekanisme penyegerakan yang sesuai boleh memastikan ketepatan program dan meningkatkan prestasi serentak pada tahap tertentu. Kunci Mutex ialah mekanisme penyegerakan yang paling biasa, yang boleh melindungi akses serentak kepada sumber kritikal, tetapi mungkin mempunyai overhed prestasi yang sedikit. Kunci baca-tulis menyediakan kawalan akses yang lebih fleksibel dan sesuai untuk senario di mana terdapat lebih banyak bacaan dan kurang penulisan. Semaphore ialah mekanisme penyegerakan umum yang boleh mengawal akses kepada sumber kritikal dengan berkesan. Bergantung pada keperluan dan senario tertentu, memilih mekanisme penyegerakan yang sesuai boleh mengoptimumkan prestasi program. 🎜

Atas ialah kandungan terperinci Kesan prestasi mekanisme penyegerakan tersedia di Golang. 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