Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah kebuntuan dalam golang? Bagaimana untuk mengelakkannya?

Apakah kebuntuan dalam golang? Bagaimana untuk mengelakkannya?

PHPz
PHPzasal
2023-03-31 15:37:521496semak imbas

1. Apakah kebuntuan?

Dalam pengaturcaraan serentak, apabila dua atau lebih proses (benang) menunggu sumber masing-masing dikeluarkan, kebuntuan berlaku. Ringkasnya, setiap proses menduduki sebahagian daripada sumber dan perlu menunggu pihak lain mengeluarkan sumber untuk menyelesaikan tugasnya sendiri, tetapi pihak lain melakukan perkara yang sama Ini akan menyebabkan gelung menunggu yang tidak berkesudahan membawa kepada keruntuhan keseluruhan sistem.

2. Golang melaksanakan kebuntuan

golang menyediakan pakej penyegerakan untuk menyokong operasi serentak, yang mana Mutex ialah salah satu jenis kunci biasa dalam golang. Mari kita ambil Mutex sebagai contoh untuk menunjukkan pelaksanaan kebuntuan golang.

Contoh kod:

package main

import (
    "sync"
)

var mu sync.Mutex

func main() {
    mu.Lock()
    go func() {
        mu.Lock()
    }()
    mu.Unlock()
}

Dalam kod ini, kami mencipta mu pembolehubah jenis Mutex Mula-mula, kami memanggil kaedah Kunci mu, dapatkan kunci mutex dan Masukkan kritikal zon. Seterusnya, kami mencipta proses pergi, di mana kami cuba mendapatkan kaedah Lock mu sekali lagi. Akhirnya kami melepaskan kunci mu mutex.

Jika kami mengalih keluar pernyataan mu.Unlock() dalam kod di atas, maka keseluruhan program akan menemui jalan buntu. Kerana dalam proses pergi, ia akan menunggu proses utama untuk melepaskan kunci sebelum ia boleh memperoleh kunci Walau bagaimanapun, proses utama tidak boleh terus berjalan kerana kunci tidak dilepaskan. Dengan cara ini, keseluruhan program akan kekal di sana dan menjadi proses zombi sehingga sistem ditamatkan secara paksa.

3. Bagaimana untuk mengelakkan kebuntuan?

Apabila berbilang proses (benang) berkongsi sumber yang sama, kebuntuan cenderung berlaku. Jadi, bagaimana untuk mengelakkan kebuntuan? Anda boleh merujuk perkara berikut:

  1. Elakkan berbilang proses (benang) menduduki sumber yang sama pada masa yang sama
  2. Apabila mendapatkan sumber, dapatkannya dalam susunan tertentu dan lakukan tidak merentas sumber;
  3. Kurangkan bilangan dan masa sumber bahagian kritikal sebanyak mungkin
  4. Anda boleh menggunakan saluran dalam golang untuk mengelakkan persaingan kunci.

Ringkasnya, kebuntuan ialah masalah biasa dalam pengaturcaraan serentak dan boleh berlaku dengan mudah dalam senario dengan persaingan sengit untuk mendapatkan sumber. Untuk mengelakkan kebuntuan, kita perlu mematuhi perjanjian tertentu, merancang dan menggunakan sumber secara munasabah, mendapatkan sumber dengan ketat mengikut urutan ia diperoleh, dan menggunakan beberapa mekanisme yang disediakan oleh golang untuk mengelakkan persaingan kunci.

Atas ialah kandungan terperinci Apakah kebuntuan dalam golang? Bagaimana untuk mengelakkannya?. 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