Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengenalan kepada jenis kunci dan kaedah aplikasi fungsi Golang

Pengenalan kepada jenis kunci dan kaedah aplikasi fungsi Golang

WBOY
WBOYasal
2023-05-18 08:06:361105semak imbas

Pengenalan kepada jenis kunci dan kaedah aplikasi fungsi Golang

Bahasa pengaturcaraan Go ialah bahasa yang cekap, berskala dan selamat serentak, dan keselamatan serentak ialah sorotan Golang. Kami biasanya menggunakan kunci untuk memastikan keselamatan benang semasa pembangunan pustaka standard Golang menyediakan berbilang jenis kunci untuk senario yang berbeza. Dalam artikel ini, kami akan memperkenalkan jenis kunci fungsi Golang dan cara menggunakannya.

  1. Mutex (mutex lock)

Mutex lock digunakan untuk melindungi sumber kongsi Hanya satu utas dibenarkan untuk memasuki bahagian kritikal pada satu-satu masa dan urutan lain mesti tunggu sumber terkunci Benang melepaskan kunci. Mutex (mutex) ialah jenis kunci yang paling asas dan boleh dilaksanakan melalui penyegerakan. Struktur Mutex di Golang.

Pembina Mutex:

var mu sync.Mutex

Berikut ialah kod sampel untuk mengunci dan membuka kunci Mutex:

mu.Lock()
// 临界区代码
mu.Unlock()

Mutex sesuai untuk sebarang senario akses sumber dikongsi, menggunakan Mutex boleh menyediakan Keselamatan benang yang baik, tetapi ia juga boleh menimbulkan masalah seperti kebuntuan.

  1. RWMutex (kunci baca-tulis)

Kunci baca-tulis ialah versi RWMutex yang dipertingkatkan adalah serupa dengan Mutex yang sedang digunakan, tetapi mempunyai ciri pemisahan daripada membaca dan menulis. RWMutex boleh membenarkan berbilang utas membaca kod bahagian kritikal pada masa yang sama, tetapi hanya membenarkan satu utas menulis kepada sumber yang dikongsi.

Pembina RWMutex:

var mu sync.RWMutex

Berikut ialah kod sampel untuk mengunci dan membuka kunci berasingan RWMutex untuk membaca dan menulis:

// 读锁定和解锁
mu.RLock()
// 读临界区代码
mu.RUnlock()

// 写锁定和解锁
mu.Lock()
// 写临界区代码
mu.Unlock()

RWMutex sesuai untuk operasi membaca dengan lebih kerap daripada operasi menulis Sumber dikongsi, ciri pemisahan baca-tulis yang disediakannya boleh meningkatkan prestasi serentak.

  1. WaitGroup (kumpulan tunggu)

WaitGroup ialah semafor mengira yang boleh digunakan untuk menunggu satu atau lebih urutan menyelesaikan tugasan. Penggunaan biasa WaitGroup ialah menunggu di utas utama untuk semua utas kanak-kanak menyelesaikan tugas mereka sebelum meneruskan ke langkah seterusnya.

Pembina WaitGroup:

var wg sync.WaitGroup

Berikut adalah kegunaan biasa WaitGroup:

// 添加一个任务
wg.Add(1)

// 完成一个任务
wg.Done()

// 等待所有任务完成
wg.Wait()

WaitGroup boleh menyelesaikan masalah penyelarasan sumber, tetapi ia juga boleh menyebabkan masalah kebuntuan, jadi ia perlu untuk Gunakan dengan berhati-hati.

  1. Cond (pembolehubah keadaan)

Cond ialah pembolehubah keadaan yang digunakan untuk komunikasi antara benang. Ia boleh menghalang satu atau lebih utas daripada meneruskan pelaksanaan sehingga syarat tertentu dipenuhi.

Pembina Cond:

var cond sync.Cond

Berikut adalah cara biasa untuk menggunakan Cond:

// 等待条件满足
cond.Wait()

// 唤醒所有等待条件的线程
cond.Broadcast()

// 唤醒一个等待条件的线程
cond.Signal()

Menggunakan Cond memerlukan berhati-hati, kerana masalah kebuntuan mudah berlaku.

  1. Sekali (satu kali pelaksanaan)

Sekali menyediakan fungsi pelaksanaan sekali, yang memastikan bahawa fungsi hanya akan dilaksanakan sekali. Sekali sering digunakan dalam senario seperti permulaan dan pengurusan sumber.

Once constructor:

var once sync.Once

Penggunaan biasa Once:

once.Do(func() {
    // 只执行一次的代码
})

Menggunakan Once boleh dengan mudah memastikan sesuatu fungsi dilaksanakan sekali sahaja.

Ringkasan

Pustaka standard Golang menyediakan berbilang jenis kunci untuk penyegerakan benang dan kerjasama dalam senario yang berbeza. Mahir dalam penggunaan pelbagai jenis kunci boleh meningkatkan prestasi concurrency program Pada masa yang sama, anda perlu memberi perhatian kepada masalah kebuntuan yang mungkin berlaku semasa proses penguncian.

Atas ialah kandungan terperinci Pengenalan kepada jenis kunci dan kaedah aplikasi fungsi 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