// package wgname -- ожидатель группы по имени для завершения package wgname import ( "fmt" "sync" "wartank/pkg/components/safe_bool" ) // WgName -- ожидатель группы завершения type WgName struct { dictName map[string]bool // Словарь имён потоков chEnd chan int // Канал сигнала закрытия ожидания isWork *safe_bool.БезопБул // Признак работы ожидания block sync.RWMutex } // NewWgName -- возвращает новый ожидатель группы func NewWgName() *WgName { сам := &WgName{ dictName: make(map[string]bool), chEnd: make(chan int, 1), isWork: safe_bool.НовБезопБул(), } сам.isWork.Уст() return сам } // Add -- добавляет имя в группу ожидания func (сам *WgName) Add(name string) error { сам.block.Lock() defer сам.block.Unlock() _, isOk := сам.dictName[name] if isOk { return fmt.Errorf("WgName.Add(): name %q already exists", name) } сам.dictName[name] = true return nil } // Done -- отмечает словарь ожидания готовности потока func (сам *WgName) Done(name string) error { сам.block.Lock() defer сам.block.Unlock() _, isOk := сам.dictName[name] if !isOk { return fmt.Errorf("WgName.Done(): name %q not exists", name) } delete(сам.dictName, name) if !сам.isWork.Получ() { return nil } if len(сам.dictName) == 0 { сам.isWork.Сброс() close(сам.chEnd) } return nil } // Wait -- ожидание закрытия группы func (сам *WgName) Wait() { <-сам.chEnd }