Back to questions
Senior
4
type Sem interface { Lock() error TryLock() bool Release() Cap() int FreeSpace() int }
Companies where asked
X5
Answer from AI
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())
}