Sobes.tech
Назад к вопросам
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())
}