Rumah >pembangunan bahagian belakang >Golang >Adakah saya perlu membuka kuncinya sebelum menyiarkan?

Adakah saya perlu membuka kuncinya sebelum menyiarkan?

王林
王林ke hadapan
2024-02-14 20:30:10650semak imbas

Adakah saya perlu membuka kuncinya sebelum menyiarkan?

Editor PHP Xiaoxin hadir untuk mendedahkan soalan popular untuk semua orang: "Adakah saya perlu membuka kuncinya sebelum menyiarkan soalan ini, jawapannya adalah ya?" Dalam industri televisyen moden, operasi membuka kunci biasanya diperlukan sebelum program boleh disiarkan. Ini kerana membuka kunci memastikan penghantaran isyarat program yang selamat dan berkesan menghalang tontonan tanpa kebenaran. Selain itu, membuka kunci juga boleh melindungi hak dan kepentingan sah hak cipta dan kandungan program, serta memberikan pengalaman tontonan berkualiti tinggi untuk majoriti penonton. Oleh itu, sebelum menonton sebarang rancangan, sila pastikan operasi membuka kunci selesai untuk mengelakkan kehilangan kandungan yang menarik.

Kandungan soalan

Saya keliru tentang kelakuan pembolehubah keadaan dalam Go.

Dalam goroutine utama, saya memperoleh kunci dan memanggil Cond.Wait() dalam gelung for untuk menyemak memori yang dikongsi. Dalam goroutine yang berfungsi, saya memperoleh kunci dan mengubah suai memori yang dikongsi, kemudian disiarkan.

Saya perasan bahawa apabila Cond.Wait() 恢复时,它会在返回之前先尝试获取锁。但是, Cond.Broadcast() menyambung semula, ia cuba mendapatkan kunci sebelum kembali. Walau bagaimanapun, Cond.Broadcast() tidak melepaskan kunci. Jadi jika saya tidak melepaskan kunci sendiri sebelum bersiaran, bukankah harus ada jalan buntu?

Saya membaca beberapa kod menggunakan sync.Cond dan mendapati ia tidak perlu, tetapi tidak tahu mengapa. sync.Cond 阅读了一些代码,发现没有必要,但不知道为什么。

解决方法

修改共享变量时必须保持锁定。当一个goroutine调用Wait时,锁被解锁,因此另一个goroutine可以锁定它并修改共享变量。当您调用 Broadcast

Penyelesaian

Pembolehubah yang dikongsi mesti dikunci semasa mengubah suainya. Apabila goroutine memanggil Tunggu, kunci dibuka supaya goroutine lain boleh menguncinya dan mengubah suai pembolehubah yang dikongsi. Goroutine mungkin atau mungkin tidak memegang kunci apabila anda memanggil Broadcast. Jika goroutine memegang kunci, goroutine yang menunggu akan dikejutkan dan menunggu sehingga mereka boleh memperoleh kunci. Apabila anda membuka kunci, salah satu goroutine yang menunggu boleh memperoleh kunci dan meneruskan. 🎜 🎜Jadi, tidak, selagi goroutine siaran akhirnya melepaskan kunci, tidak akan ada kebuntuan. 🎜

Atas ialah kandungan terperinci Adakah saya perlu membuka kuncinya sebelum menyiarkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam