Bagaimanakah anda boleh mencapai pengecualian bersama dalam Goroutines serentak menggunakan Mutexes?

Susan Sarandon
Lepaskan: 2024-10-30 05:50:28
asal
559 orang telah melayarinya

How can you achieve mutual exclusion in concurrent Goroutines using Mutexes?

Pengecualian Bersama dalam Goroutine Serentak Menggunakan Mutex

Konsep pengecualian bersama mengawal pelaksanaan fungsi atau sekatan kod secara serentak dalam program. Dalam persekitaran pengaturcaraan serentak, di mana berbilang rutin dilaksanakan secara berasingan, mengekalkan pengecualian bersama adalah penting untuk memastikan ketepatan dan mencegah konflik.

Masalah:
Pertimbangkan senario dengan tiga goroutin serentak (Rutin 1, 2, dan 3), yang menukar data dan melaksanakan operasi pencetakan. Matlamatnya adalah untuk memastikan bahawa semasa bahagian kod tertentu dalam mana-mana goroutine sedang dilaksanakan, pelaksanaan dalam goroutine lain dihentikan, sehingga bahagian ini selesai.

Penyelesaian Menggunakan Mutex:
Mutexes , primitif penyegerakan asas, boleh digunakan untuk mencapai pengecualian bersama dalam goroutine. Mutexes menyediakan mekanisme penguncian yang membenarkan hanya satu goroutine mengakses bahagian kritikal kod pada satu masa.

Dalam coretan kod yang disediakan, tiga mutex (mutex1, mutex2 dan mutex3) telah diperkenalkan:

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)
Salin selepas log masuk

Setiap goroutine memperoleh mutex yang sesuai sebelum melaksanakan bahagian kritikal, seperti yang ditunjukkan dalam kod yang disemak:

func Routine1() {
    mutex1.Lock()
    // do something
    ...
    // do something
    mutex1.Unlock()
    ...
}

func Routine2() {
    mutex2.Lock()
    ...
    // do something
    ...
    mutex2.Unlock()
    ...
}

func Routine3() {
    ...
    mutex3.Lock()
    // do something
    ...
    mutex3.Unlock()
    ...
}
Salin selepas log masuk
  • Rutin1 memperoleh mutex1 semasa melaksanakan bahagian kritikal, menyekat rutin lain daripada mengakses bahagian ini.
  • Routine2 memperoleh mutex2, memastikan pelaksanaan eksklusif bahagian kritikalnya.
  • Routine3 memperoleh mutex3 untuk mengawal akses kepada bahagian kritikalnya.

Kumpulan Tunggu dan Penyegerakan:
Selain itu, kumpulan tunggu (wg) telah digunakan untuk menyegerakkan goroutine:

wg.Add(3)
go Routine1()
go Routine2()
Routine3()
wg.Wait()
Salin selepas log masuk
  • Kaedah Tambah menambah pembilang kumpulan tunggu sebanyak 3 , menunjukkan bahawa tiga goroutin akan dilaksanakan.
  • Pernyataan go запускает Routine1 dan Routine2 serentak.
  • Routine3 dilaksanakan dalam urutan semasa.
  • Kaedah Tunggu menyekat sehingga kaunter kumpulan tunggu mencapai sifar, memastikan semua goroutine telah menyelesaikan pelaksanaan sebelum fungsi utama diteruskan.

Keputusan:
Dengan pelaksanaan ini, pelaksanaan bahagian kritikal dalam goroutine akan saling eksklusif. Akibatnya, operasi pencetakan dalam setiap rutin tidak akan bertindih atau bersilang, menghalang keadaan perlumbaan dan menghasilkan output yang dijangkakan.

Atas ialah kandungan terperinci Bagaimanakah anda boleh mencapai pengecualian bersama dalam Goroutines serentak menggunakan Mutexes?. 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!