Sobes.tech
Junior — Middle

Za jakých podmínek dochází k blokování při práci se standardním kanálem přenosu dat?

sobes.tech AI

Odpověď od AI

V Go je standardní kanál pro přenos dat blokován v následujících případech:

  • Při odesílání hodnoty do kanálu (chan <- value), pokud kanál nemá buffer nebo je plný, blokuje se odesílající gorutina, dokud jiný vlákno ne přečte hodnotu.
  • Při čtení z kanálu (value := <- chan), pokud je kanál prázdný, blokuje se čtoucí gorutina, dokud se neobjeví data.

Tímto způsobem dochází k blokování při pokusu o odeslání dat do plného kanálu nebo odeslání z prázdného kanálu, což zajišťuje synchronizaci mezi gorutinami.

Příklad:

ch := make(chan int) // kanál bez bufferu

// Odeslání se blokuje, dokud někdo ne přečte
go func() {
    ch <- 42
}()

hodnota := <-ch // čtení odemyká odeslání
fmt.Println(hodnota)