26 lines
502 B
Go
26 lines
502 B
Go
package semaphore
|
||
|
||
import "sync"
|
||
|
||
type SemaChan struct {
|
||
sync.Locker
|
||
sem chan struct{} // 信号量通道
|
||
}
|
||
|
||
func NewSemaChan(n int) *SemaChan {
|
||
if n <= 0 {
|
||
n = 1 // 确保信号量至少为1,直接变成一个互斥锁
|
||
}
|
||
return &SemaChan{
|
||
sem: make(chan struct{}, n), // 初始化信号量通道,容量为n
|
||
}
|
||
}
|
||
|
||
func (s *SemaChan) Lock() {
|
||
<-s.sem // 使用接收的方式阻塞,用来与 sync.Mutex 的内存模型保持一致
|
||
}
|
||
|
||
func (s *SemaChan) Unlock() {
|
||
s.sem <- struct{}{}
|
||
}
|