Назад к вопросам
Senior
3
type Sem interface { Lock() error TryLock() bool Release() Cap() int FreeSpace() int }
Компании, где спрашивали
X5
Ответ от нейросети
sobes.tech AI
Интерфейс Sem описывает семафор с методами для блокировки и управления ресурсами:
Lock() error— блокирует семафор, ожидая освобождения ресурса. Возвращает ошибку, если блокировка невозможна.TryLock() bool— пытается немедленно захватить семафор, возвращаетtrue, если удалось, иначеfalse.Release()— освобождает захваченный ресурс.Cap() int— возвращает максимальное количество ресурсов (ёмкость семафора).FreeSpace() int— возвращает количество свободных ресурсов в данный момент.
Пример реализации простого семафора на каналах:
package main
import (
"fmt"
"sync"
)
type Sem interface {
Lock() error
TryLock() bool
Release()
Cap() int
FreeSpace() int
}
type semaphore struct {
ch chan struct{}
mutex sync.Mutex
}
func NewSemaphore(capacity int) Sem {
return &semaphore{ch: make(chan struct{}, capacity)}
}
func (s *semaphore) Lock() error {
s.ch <- struct{}{} // блокируется, если канал заполнен
return nil
}
func (s *semaphore) TryLock() bool {
select {
case s.ch <- struct{}{}:
return true
default:
return false
}
}
func (s *semaphore) Release() {
<-s.ch
}
func (s *semaphore) Cap() int {
return cap(s.ch)
}
func (s *semaphore) FreeSpace() int {
return cap(s.ch) - len(s.ch)
}
func main() {
sem := NewSemaphore(3)
fmt.Println("Capacity:", sem.Cap())
fmt.Println("Free space:", sem.FreeSpace())
sem.Lock()
fmt.Println("Free space after Lock:", sem.FreeSpace())
if sem.TryLock() {
fmt.Println("TryLock succeeded")
}
sem.Release()
fmt.Println("Free space after Release:", sem.FreeSpace())
}