Können Semaphore gepuffertes Locking in Go emulieren?

DDD
Freigeben: 2024-11-14 18:37:02
Original
284 Leute haben es durchsucht

Can Semaphores Emulate Buffered Locking in Go?

Gepufferte Sperrmuster

In Go ermöglicht das Konzept eines gepufferten Kanals nicht blockierende Vorgänge, bis der Puffer des Kanals gefüllt ist. Inspiriert durch diesen Mechanismus entsteht die Frage: Gibt es ein allgemeines Muster ähnlich gepufferten Kanälen für „gepufferte Sperrung“, bei dem eine Ressource für eine endliche Menge von Clients gesperrt werden kann?

Antwort: Semaphoren

Das Primitiv, das diese Anforderung erfüllt, ist ein Semaphor. Da ein Semaphor mit einem gepufferten Kanal konstruiert ist, begrenzt es die Anzahl der gleichzeitigen Clients, die auf eine Ressource zugreifen können.

Betrachten Sie die folgende Implementierung mit einem gepufferten Kanal:

var semaphore = make(chan struct{}, 4) // allow four concurrent users

func f() {
    // Grab the lock. Blocks as long as 4 other invocations of f are still running.
    semaphore <- struct{}{}

    // Release the lock once we're done.
    defer func() { <-semaphore }()

    // Do work...
}
Nach dem Login kopieren

In diesem Szenario , erhält die f-Funktion die Sperre, indem sie einen Wert in den Semaphorkanal sendet. Wenn der Kanal voll ist, was der maximal zulässigen Parallelität entspricht, blockiert f, bis ein anderer Client die Sperre aufhebt, indem er einen Wert vom Kanal empfängt. Die Defer-Anweisung stellt sicher, dass die Sperre aufgehoben wird, wenn die Funktion zurückkehrt.

Das obige ist der detaillierte Inhalt vonKönnen Semaphore gepuffertes Locking in Go emulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage