Rumah pembangunan bahagian belakang Golang Tetapan penyegerakan Golang

Tetapan penyegerakan Golang

May 15, 2023 am 09:47 AM

Golang ialah bahasa pengaturcaraan yang berkuasa dan kelebihannya dalam mengendalikan pengaturcaraan serentak juga diiktiraf secara meluas. Di Golang, tetapan penyegerakan adalah bahagian penting dalam mengendalikan pengaturcaraan serentak, dan ia juga merupakan salah satu kunci untuk memastikan ketepatan program. Oleh itu, dalam artikel ini, kami akan menyelidiki persediaan penyegerakan Golang dan membincangkan cara ia membolehkan kawalan serentak yang cekap.

Tetapan penyegerakan Golang

Tetapan penyegerakan Golang terutamanya termasuk aspek berikut:

  1. Mutex (Mutex)

Mutex ialah salah satu daripada tetapan penyegerakan yang paling biasa digunakan. Ia memastikan bahawa hanya satu utas mengakses sumber yang dikongsi pada masa yang sama. Dalam Go, kunci mutex boleh dilaksanakan menggunakan jenis Mutex yang disediakan oleh pakej penyegerakan.

Anda perlu memberi perhatian kepada perkara berikut apabila menggunakan Mutex:

  • Anda perlu memperoleh kunci sebelum mengakses sumber kongsi dan anda perlu melepaskan kunci selepas digunakan.
  • Pastikan untuk tidak memanggil penyekatan atau operasi yang memakan masa lama semasa mengunci, jika tidak, benang lain tidak akan dapat memperoleh kunci.
  1. Kunci baca-tulis (RWMutex)

RWMutex ialah kunci yang menyokong berbilang operasi baca dan satu operasi tulis pada masa yang sama. Dalam Go, RWMutex boleh dilaksanakan menggunakan jenis RWMutex yang disediakan oleh pakej penyegerakan.

Anda perlu memberi perhatian kepada perkara berikut apabila menggunakan RWMutex:

  • Anda perlu mendapatkan kunci baca atau kunci tulis sebelum mengakses sumber kongsi dan anda perlu melepaskan kunci selepas digunakan.
  • Kunci tulis dan kunci baca adalah saling eksklusif, iaitu, semasa satu utas memperoleh kunci tulis, utas lain tidak boleh memperoleh kunci baca atau kunci tulis pada masa yang sama.
  1. Pembolehubah keadaan (Cond)

Cond ialah mekanisme penyegerakan berasaskan kunci yang digunakan untuk menyegerakkan perubahan dalam keadaan sumber dikongsi antara utas. Dalam Go, anda boleh menggunakan jenis Cond yang disediakan oleh pakej penyegerakan untuk melaksanakan pembolehubah keadaan.

Anda perlu memberi perhatian kepada perkara berikut apabila menggunakan pembolehubah keadaan:

  • Anda perlu mendapatkan kunci yang berkaitan sebelum mengakses sumber yang dikongsi dan anda perlu melepaskan kunci selepas guna.
  • Apabila menunggu pembolehubah keadaan, anda perlu memastikan keadaan memenuhi syarat supaya sumber yang dikongsi boleh digunakan dengan betul apabila bangun dari tidur.
  1. Semaphore

Semaphore ialah tetapan penyegerakan klasik, yang juga boleh dilaksanakan di Golang dengan menggunakan saluran. Sebagai contoh, anda boleh menentukan saluran dengan penimbal untuk melaksanakan fungsi kaunter untuk mengawal akses serentak.

Anda perlu memberi perhatian kepada perkara berikut apabila menggunakan semaphore:

  • Anda perlu mendapatkan semaphore sebelum mengakses sumber yang dikongsi, dan anda perlu melepaskan semaphore selepas akses itu selesai.
  • Anda boleh menggunakan saluran dengan penimbal untuk melaksanakan fungsi kaunter untuk mengawal akses serentak dengan berkesan.

Contoh aplikasi tetapan penyegerakan Golang

Untuk lebih memahami tetapan penyegerakan Golang, mari kita lihat contoh mudah untuk menunjukkan cara menggunakan kunci mutex.

Pertama, kita perlu mencipta struktur yang mengandungi sumber kongsi:

type SharedResource struct {
    count int
    mutex sync.Mutex
}
Salin selepas log masuk

Struktur ini mengandungi kiraan pembilang dan mutex mutex untuk melindungi pembilang.

Seterusnya, kita boleh mencipta dua utas untuk melaksanakan operasi baca dan tulis melalui mutex kunci mutex:

func (s *SharedResource) Increment() {
    s.mutex.Lock()
    defer s.mutex.Unlock()
    s.count++
}

func (s *SharedResource) Decrement() {
    s.mutex.Lock()
    defer s.mutex.Unlock()
    s.count--
}
Salin selepas log masuk

Dalam kaedah Penambahan dan Penurunan, kita perlu mendapatkan kunci mutex dan mengira pembilang Operasi baca dan tulis dilakukan, dan kemudian kunci dilepaskan.

Akhir sekali, kami boleh mencipta berbilang rangkaian untuk menggunakan sumber yang dikongsi:

func main() {
    var wg sync.WaitGroup
    sharedResource := SharedResource{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            sharedResource.Increment()
            sharedResource.Decrement()
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(sharedResource.count)
}
Salin selepas log masuk

Dalam contoh ini, kami mencipta 10 rangkaian untuk menggunakan sumber yang dikongsi secara serentak. Dalam setiap urutan, kami mula-mula memanggil kaedah Penambahan untuk meningkatkan kiraan sebanyak 1, dan kemudian memanggil kaedah Penurunan untuk mengurangkan kiraan sebanyak 1. Akhir sekali, kami menunggu semua benang selesai melaksanakan dan kemudian mengeluarkan nilai kiraan.

Melalui contoh ini, kita dapat melihat cara menggunakan kunci mutex dan cara memastikan ketepatan sumber yang dikongsi.

Ringkasan

Tetapan penyegerakan Golang merupakan bahagian penting dalam mencapai pengaturcaraan serentak yang cekap, antaranya kunci mutex, kunci baca-tulis, pembolehubah keadaan dan semaphore adalah cara utama untuk mencapai penyegerakan. Dalam proses menggunakan tetapan penyegerakan, kita perlu memberi perhatian kepada pemerolehan dan pelepasan kunci, penggunaan pembolehubah keadaan yang betul, dll., untuk memastikan ketepatan sumber yang dikongsi. Dengan mendalami penggunaan tetapan penyegerakan, kami boleh membangunkan atur cara serentak yang cekap dengan lebih baik.

Atas ialah kandungan terperinci Tetapan penyegerakan 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

Tag artikel 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)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Mar 10, 2025 pm 05:38 PM

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya?

See all articles