Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Kunci Mutex boleh digunakan untuk mencapai Pengecualian Bersama dalam Goroutine Serentak?

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

Susan Sarandon
Susan Sarandonasal
2024-11-01 17:43:30123semak imbas

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>

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!

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