Исходники и презентации
This commit is contained in:
38
lessons/sync_primitives/semaphore/main.go
Normal file
38
lessons/sync_primitives/semaphore/main.go
Normal file
@ -0,0 +1,38 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Semaphore struct {
|
||||
count int
|
||||
max int
|
||||
condition *sync.Cond
|
||||
}
|
||||
|
||||
func NewSemaphore(limit int) *Semaphore {
|
||||
mutex := &sync.Mutex{}
|
||||
return &Semaphore{
|
||||
max: limit,
|
||||
condition: sync.NewCond(mutex),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Semaphore) Acquire() {
|
||||
s.condition.L.Lock()
|
||||
defer s.condition.L.Unlock()
|
||||
|
||||
for s.count >= s.max {
|
||||
s.condition.Wait()
|
||||
}
|
||||
|
||||
s.count++
|
||||
}
|
||||
|
||||
func (s *Semaphore) Release() {
|
||||
s.condition.L.Lock()
|
||||
defer s.condition.L.Unlock()
|
||||
|
||||
s.count--
|
||||
s.condition.Signal()
|
||||
}
|
||||
Reference in New Issue
Block a user