cpp

Буфферизированные каналы

Буфферизированные каналы могут содержать указанное количество значений. Поток-писатель блокируется до момента освобождения хотя бы одного свободного места внутри канала. Поток-читатель блокируется до момента появления данных в канале. Прочитанные данные удаляются из канала.

Объявление и инициализация буфферизированных каналов выполняется по следующим схемам:

var <Название канала> chan <Тип данных> = make(chan <Тип данных>,
                                               <Емкость>)
<Название канала> := make(chan <Тип данных>, <Емкость>)

Параметр <Емкость> задает максимальное количество элементов, которое можно записать в канал без блокировки потока. Пример объявления каналов из трех элементов, содержащих данные типа int:

var ch chan int = make(chan int, 3)
ch2 := make(chan int, 3)

Получить емкость канала внутри программы позволяет глобальная функция cap():

fmt.Println(cap(ch)) // 3

С помощью глобальной функции len() можно определить количество элементов внутри канала, доступных для чтения:

fmt.Println(len(ch)) // 0

Пример использования буфферизированных каналов приведен в листинге 18.9.

Листинг 18.9. Буфферизированные каналы

package main

import (
   "fmt"
   "sync"
)

func main() {
   var wg sync.WaitGroup
   var ch chan int = make(chan int, 3)
   ch2 := make(chan int, 3)
   wg.Add(2)
   go func() {
      defer wg.Done()
      for i := 0; i < cap(ch); i++ {
         fmt.Println(<-ch) // Читаем данные из канала
      }
   }()
   go test(ch2, &wg)
   for i := 0; i < 3; i++ {
      ch <- i // Записываем данные в канал
   }
   for i := 5; i < 8; i++ {
      ch2 <- i // Записываем данные в канал
   }
   wg.Wait()
   fmt.Println("Конец функции main()")
}
func test(ch chan int, wg *sync.WaitGroup) {
   defer wg.Done()
   for i := 0; i < cap(ch); i++ {
      fmt.Println(<-ch) // Читаем данные из канала
   }
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp