Bagaimanakah Kunci Mutex boleh digunakan untuk mencapai Pengecualian Bersama dalam Goroutine Serentak?

Susan Sarandon
Lepaskan: 2024-11-01 17:43:30
asal
132 orang telah melayarinya

How can Mutex Locks be used to achieve Mutual Exclusion in Concurrent Goroutines?

Pengecualian Bersama Goroutine Serentak dengan Kunci Mutex

Dalam kod anda, anda ingin memastikan bahagian kod tertentu dalam setiap goroutine dilaksanakan secara berasingan . Ini menghalang pelaksanaan serentak bahagian ini oleh goroutine lain. Begini cara pengecualian bersama boleh dicapai menggunakan kunci mutex:

Garis kod yang disediakan menunjukkan aliran goroutin dan keperluan untuk pengecualian bersama. Anda ingin menghalang pelaksanaan daripada berpindah ke goroutine lain semasa acara tertentu sedang dilaksanakan dalam satu goroutine.

Untuk melaksanakan ini, kunci mutex boleh digunakan. Mutex memastikan bahawa hanya satu goroutine boleh mengakses sumber yang dikongsi pada bila-bila masa. Berikut ialah versi kod anda yang diubah suai sedikit yang menggunakan mutex untuk pengecualian bersama:

<code class="go">package main

import (
    "fmt"
    "rand"
    "sync"
)

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)

func Routine1() {
    mutex1.Lock()
    // Do something
    for i := 0; i < 200; i++ {
        mutex2.Lock()
        mutex3.Lock()
        fmt.Println("Value of z")
        mutex2.Unlock()
        mutex3.Unlock()
    }
    // Do something
    mutex1.Unlock()
    wg.Done()
}

func Routine2() {
    mutex2.Lock()
    // Do something
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        mutex3.Lock()
        fmt.Println("Value of z")
        mutex1.Unlock()
        mutex3.Unlock()
    }
    // Do something
    mutex2.Unlock()
    wg.Done()
}

func Routine3() {
    mutex3.Lock()
    // Do something
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        mutex2.Lock()
        fmt.Println("Value of z")
        mutex1.Unlock()
        mutex2.Unlock()
    }
    // Do something
    mutex3.Unlock()
    wg.Done()
}

func main() {
    wg.Add(3)
    go Routine1()
    go Routine2()
    Routine3()
    wg.Wait()
}</code>
Salin selepas log masuk

Begini cara kod yang dikemas kini ini mencapai pengecualian bersama:

  1. Kunci mutex dibuat untuk setiap goroutine (mutex1, mutex2, dan mutex3).
  2. Apabila goroutine perlu mengakses bahagian kritikal (di mana pengecualian bersama diperlukan), ia mengunci mutex yang sepadan.
  3. Semasa mutex dikunci oleh satu goroutine, goroutine lain yang cuba mengakses mutex yang sama akan disekat sehingga ia menjadi tidak berkunci.
  4. Setelah bahagian kritikal selesai, goroutine membuka kunci mutex, membenarkan goroutine lain mengaksesnya.

Pelaksanaan ini memastikan bahagian kod yang ditentukan dalam setiap goroutine dilaksanakan secara berasingan, menghalang pelaksanaan serentak daripada goroutine lain.

Atas ialah kandungan terperinci Bagaimanakah Kunci Mutex boleh digunakan untuk mencapai Pengecualian Bersama dalam Goroutine Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
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!