Rumah pembangunan bahagian belakang Golang Analisis mendalam tentang cara kunci berfungsi di Golang

Analisis mendalam tentang cara kunci berfungsi di Golang

Dec 28, 2023 pm 01:50 PM
kunci prinsip kerja golang (golang)

Analisis mendalam tentang cara kunci berfungsi di Golang

Analisis mendalam tentang cara kunci berfungsi di Golang

Pengenalan:
Dalam pengaturcaraan serentak, adalah penting untuk mengelakkan keadaan perlumbaan. Untuk mencapai keselamatan benang, Golang menyediakan mekanisme kunci yang kaya. Artikel ini akan memberikan analisis mendalam tentang cara kunci berfungsi di Golang dan memberikan contoh kod khusus.

1. Kunci Mutex (Mutex)

Kunci Mutex ialah mekanisme kunci yang paling biasa digunakan Golang menyediakan jenis Mutex dalam pakej penyegerakan untuk melaksanakannya. Mutex menyediakan dua kaedah: Lock() dan Unlock(), yang digunakan untuk mengunci dan membuka kunci masing-masing.

Kunci Mutex berfungsi dengan cuba mengunci sebelum mengakses sumber yang dikongsi. Jika kunci sudah dipegang oleh benang lain, benang semasa akan disekat menunggu. Sebaik sahaja kunci dilepaskan, benang menunggu akan dibangkitkan dan meneruskan pelaksanaan.

Berikut ialah contoh kod menggunakan kunci mutex:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mutex sync.Mutex
)

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

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println("Count:", count)
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan kiraan pembolehubah integer sebagai sumber kongsi. Fungsi increment() digunakan untuk meningkatkan nilai kiraan. Dengan menggunakan mutex untuk melindungi capaian kiraan, ia dipastikan bahawa persaingan data tidak akan berlaku apabila berbilang gorout mengaksesnya pada masa yang sama.

2. Kunci baca-tulis (RWMutex)

Terdapat masalah apabila kunci mutex melindungi sumber yang dikongsi: walaupun hanya terdapat operasi baca, ia tidak boleh dilaksanakan secara selari. Untuk menyelesaikan masalah ini, Golang menyediakan kunci baca-tulis (RWMutex).

Kunci baca-tulis ialah mekanisme kunci khas yang membenarkan berbilang goroutin membaca sumber yang dikongsi pada masa yang sama, tetapi hanya membenarkan satu goroutine melakukan operasi tulis.

RWMutex menyediakan tiga kaedah: RLock(), RUnlock() dan Lock(), yang digunakan untuk menambah kunci baca, kunci tafsiran dan kunci tulis masing-masing.

Berikut ialah contoh kod menggunakan kunci baca-tulis:

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    count int
    rwLock sync.RWMutex
)

func read() {
    rwLock.RLock()
    defer rwLock.RUnlock()
    fmt.Println("Read:", count)
}

func write() {
    rwLock.Lock()
    defer rwLock.Unlock()
    count++
    fmt.Println("Write:", count)
}

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

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            write()
        }()
    }

    wg.Wait()
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan kiraan pembolehubah integer untuk mensimulasikan sumber kongsi. Fungsi read() digunakan untuk membaca nilai kiraan, dan fungsi write() digunakan untuk meningkatkan nilai kiraan. Dengan menggunakan kunci baca-tulis untuk melindungi akses kepada pengiraan, operasi baca boleh dilaksanakan secara selari, manakala operasi tulis adalah saling eksklusif.

3. Pembolehubah keadaan (Cond)

Pembolehubah keadaan ialah mekanisme kunci khas, yang digunakan untuk mencapai penyegerakan antara benang. Pembolehubah keadaan boleh mengawal dengan tepat susunan pelaksanaan benang dan mengelakkan menunggu gelung tidak sah.

Golang menyediakan jenis Cond dalam pakej penyegerakan untuk melaksanakan pembolehubah keadaan. Cond menyediakan tiga kaedah: Tunggu(), Signal() dan Broadcast(). Kaedah

  • Wait() digunakan untuk menunggu pembolehubah keadaan dipenuhi, sambil melepaskan kunci dan menggantung benang semasa.
  • Kaedah Signal() digunakan untuk membangunkan benang yang menunggu.
  • Kaedah Siaran() digunakan untuk membangunkan semua utas yang menunggu.

Berikut ialah contoh kod menggunakan pembolehubah keadaan:

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    count int
    cond *sync.Cond
)

func producer() {
    for {
        cond.L.Lock()
        count++
        fmt.Println("Produce:", count)
        cond.Signal()
        cond.L.Unlock()
        time.Sleep(time.Second)
    }
}

func consumer() {
    for {
        cond.L.Lock()
        for count == 0 {
            cond.Wait()
        }
        fmt.Println("Consume:", count)
        count--
        cond.L.Unlock()
    }
}

func main() {
    var wg sync.WaitGroup
    cond = sync.NewCond(&sync.Mutex{})
    wg.Add(2)
    go func() {
        defer wg.Done()
        producer()
    }()

    go func() {
        defer wg.Done()
        consumer()
    }()

    wg.Wait()
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan kiraan pembolehubah integer untuk mensimulasikan sumber yang dikongsi. Fungsi producer() digunakan untuk meningkatkan nilai kiraan dan membangkitkan benang menunggu, dan fungsi consumer() digunakan untuk mengurangkan nilai kiraan dan menunggu syarat dipenuhi. Penyegerakan antara pengeluar dan pengguna dipastikan melalui penggunaan pembolehubah keadaan.

Kesimpulan:
Artikel ini menyediakan analisis mendalam tentang cara kunci berfungsi di Golang dan menyediakan contoh kod khusus untuk setiap mekanisme penguncian. Kunci Mutex, kunci baca-tulis dan pembolehubah keadaan ialah mekanisme kunci yang paling biasa digunakan di Golang Pembangun boleh memilih kunci yang sesuai berdasarkan keperluan sebenar untuk melindungi akses kepada sumber yang dikongsi dan memastikan keselamatan rangkaian program. Pada masa yang sama, pembangun harus memberi perhatian kepada senario penggunaan dan kesan prestasi kunci untuk mengelakkan persaingan kunci yang tidak perlu dan masalah kebuntuan.

Atas ialah kandungan terperinci Analisis mendalam tentang cara kunci berfungsi di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

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)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Fahami cara iframe berfungsi: Bagaimanakah ia berfungsi? Fahami cara iframe berfungsi: Bagaimanakah ia berfungsi? Jan 06, 2024 am 09:24 AM

Di dalam iframe: Bagaimanakah ia berfungsi? Pengenalan: Dalam reka bentuk web moden, kami sering menggunakan elemen iframe untuk membenamkan halaman web lain atau memaparkan kandungan daripada domain lain. Jadi, bagaimanakah iframe berfungsi? Artikel ini akan mendedahkan cara iframe berfungsi melalui contoh kod terperinci. 1. Apakah iframe? iframe (InlineFrame) ialah elemen dalam HTML yang boleh membenamkan halaman web lain dalam halaman web atau memaparkan kandungan daripada domain lain. lulus

Cara perisian tengah Laravel berfungsi dan cara menggunakannya Cara perisian tengah Laravel berfungsi dan cara menggunakannya Aug 02, 2023 am 10:13 AM

Prinsip kerja dan kemahiran penggunaan perisian tengah Laravel 1. Pengenalan Dalam rangka kerja Laravel, perisian tengah ialah fungsi yang sangat penting yang boleh digunakan untuk melaksanakan beberapa fungsi sebelum atau selepas permintaan mencapai laluan aplikasi. Middleware bukan sahaja menyediakan cara ringkas dan fleksibel untuk mengendalikan permintaan, tetapi juga boleh digunakan untuk mengendalikan beberapa siri operasi seperti pengesahan, kawalan kebenaran dan pengelogan. Artikel ini akan memperkenalkan prinsip kerja dan kemahiran penggunaan perisian tengah Laravel, dan menyediakan beberapa contoh kod untuk digambarkan. 2. Prinsip kerja perisian tengah adalah dalam L

Analisis mendalam tentang mekanisme kunci mutex di Golang Analisis mendalam tentang mekanisme kunci mutex di Golang Jan 24, 2024 am 08:57 AM

Penjelasan terperinci tentang mekanisme pelaksanaan kunci di Golang Dalam pengaturcaraan berbilang benang, untuk memastikan keselamatan sumber yang dikongsi, kita sering perlu menggunakan kunci. Tujuan kunci adalah untuk memastikan bahawa hanya satu utas boleh mengakses sumber yang dikongsi pada masa yang sama, dengan itu mengelakkan ralat yang disebabkan oleh persaingan data. Di Golang, beberapa mekanisme kunci terbina dalam disediakan, seperti mutex (mutex), kunci baca-tulis (RWMutex), dsb. Artikel ini akan memperkenalkan mekanisme pelaksanaan kunci di Golang secara terperinci dan memberikan contoh kod khusus. 1. Mutex

Bagaimana untuk melaksanakan kemahiran pengaturcaraan berbilang benang teras JAVA Bagaimana untuk melaksanakan kemahiran pengaturcaraan berbilang benang teras JAVA Nov 08, 2023 pm 01:30 PM

Sebagai bahasa pengaturcaraan yang sangat baik, Java digunakan secara meluas dalam pembangunan peringkat perusahaan. Antaranya, pengaturcaraan berbilang benang adalah salah satu kandungan teras Java. Dalam artikel ini, kami akan memperkenalkan cara menggunakan teknik pengaturcaraan berbilang benang dalam Java, serta contoh kod khusus. Cara Mencipta Benang Terdapat dua cara untuk mencipta benang dalam Java iaitu mewarisi kelas Benang dan melaksanakan antara muka Runnable. Cara untuk mewarisi kelas Thread adalah seperti berikut: publicclassExampleThreadext

Bagaimana untuk menyelesaikan masalah konkurensi Java Bagaimana untuk menyelesaikan masalah konkurensi Java Jun 30, 2023 am 08:24 AM

Bagaimana untuk menyelesaikan masalah konkurensi kod yang dihadapi dalam Java Pengenalan: Dalam pengaturcaraan Java, menghadapi masalah konkurensi adalah situasi yang sangat biasa. Masalah konkurensi merujuk kepada apabila berbilang rangkaian mengakses dan mengendalikan sumber dikongsi pada masa yang sama, yang mungkin membawa kepada hasil yang tidak dapat diramalkan. Masalah ini mungkin termasuk perlumbaan data, kebuntuan, livelock, dsb. Artikel ini akan memperkenalkan beberapa kaedah biasa dan berkesan untuk menyelesaikan masalah konkurensi di Jawa. 1. Kawalan penyegerakan: kata kunci disegerakkan: kata kunci disegerakkan ialah kata kunci penyegerakan paling asas dalam Java

Bagaimana untuk menyelesaikan masalah kawalan konkurensi benang di Java Bagaimana untuk menyelesaikan masalah kawalan konkurensi benang di Java Oct 09, 2023 am 10:54 AM

Cara menyelesaikan masalah kawalan konkurensi benang dalam Java Java ialah bahasa pengaturcaraan yang biasa digunakan, dan pengaturcaraan serentaknya adalah salah satu ciri pentingnya. Walau bagaimanapun, dalam pengaturcaraan berbilang benang, isu kawalan konkurensi antara utas adalah cabaran biasa. Untuk memastikan berbilang benang boleh berfungsi bersama dengan betul, kita perlu mengambil beberapa langkah untuk menyelesaikan masalah kawalan konkurensi benang. Artikel ini akan memperkenalkan beberapa kaedah yang biasa digunakan dan contoh kod khusus untuk membantu pembaca lebih memahami dan menyelesaikan isu kawalan konkurensi benang di Java. Menggunakan mekanisme kunci Kunci ialah mekanisme penyegerakan

Analisis mendalam tentang cara kunci berfungsi di Golang Analisis mendalam tentang cara kunci berfungsi di Golang Dec 28, 2023 pm 01:50 PM

Analisis mendalam tentang cara kunci berfungsi di Golang Pengenalan: Dalam pengaturcaraan serentak, adalah penting untuk mengelakkan keadaan perlumbaan. Untuk mencapai keselamatan benang, Golang menyediakan mekanisme kunci yang kaya. Artikel ini akan memberikan analisis mendalam tentang cara kunci berfungsi di Golang dan memberikan contoh kod khusus. 1. Mutex lock (Mutex) Mutex lock ialah mekanisme kunci yang paling biasa digunakan Golang menyediakan jenis Mutex dalam pakej penyegerakan untuk melaksanakannya. Mutex menyediakan dua kaedah: L

Analisis kelebihan dan kekurangan warisan Golang dan cadangan penggunaan Analisis kelebihan dan kekurangan warisan Golang dan cadangan penggunaan Dec 30, 2023 pm 01:20 PM

Analisis kelebihan dan kekurangan panduan pewarisan dan penggunaan Golang Pengenalan: Golang ialah bahasa pengaturcaraan sumber terbuka dengan ciri-ciri kesederhanaan, kecekapan dan keselarasan. Sebagai bahasa pengaturcaraan berorientasikan objek, Golang menyediakan penggunaan semula kod melalui komposisi dan bukannya warisan. Warisan ialah konsep yang biasa digunakan dalam pengaturcaraan berorientasikan objek yang membenarkan satu kelas mewarisi sifat dan kaedah kelas lain. Walau bagaimanapun, di Golang, warisan bukanlah kaedah pengaturcaraan pilihan, tetapi penggunaan semula kod dicapai melalui gabungan antara muka. Dalam artikel ini, kami

See all articles