Sobes.tech
Middle

Mit lehet és mit nem szabad tenni a Go csatornákban lévő szálbiztonsággal?

sobes.tech MI

Válasz az MI-től

Lehet:

  • Adatok küldése és fogadása. Minden olvasási és írási művelet egy csatornában atomikus.
  • Csatorna bezárása. A bezárás jelzi, hogy a adatküldés befejeződött.
  • Az select operátor használata nem blokkoló interakcióhoz több csatornával.
  • Bufferelt és nem bufferelt csatornák használata különböző szinkronizációs forgatókönyvekhez.

Nem szabad:

  • Egy csatorna bezárása több goroutine-ból egyszerre további szinkronizáció nélkül. Ez pánikot okozhat.
  • Már bezárt csatorna bezárása. Ez szintén pánikot okoz.
  • Adatok küldése egy bezárt csatornába. Ez pánikot eredményez.
  • Null (nem inicializált) csatornából olvasás várása. Ez blokkolja a goroutine-t.
  • Null (nem inicializált) csatornába írás várása. Ez blokkolja a goroutine-t.

Csatornák használatának példája:

// Nem bufferelt csatorna létrehozása int típushoz
messages := make(chan int)

// Goroutine adatküldéshez
go func() {
	messages <- 1 // 1 küldése a csatornára
	messages <- 2 // 2 küldése a csatornára
	close(messages) // A csatorna bezárása küldés után
}()

// Adatok olvasása a csatornából
firstMessage := <-messages
secondMessage := <-messages

// Egy lezárt csatornából való olvasás a null értéket és ok=false értéket ad vissza
value, ok := <-messages