这里建议直接看go的锁源码,实现的太优雅了!尤其是读写锁。通过对readerCount
正负的控制就实现对读写操作的控制。我这里就是简单使用channel代替信号量的传递。
锁
type Mutex struct {
mu chan struct{
}
}
func NewMutex() *Mutex {
return &Mutex{
mu: make(chan struct{
}, 1)}
}
func (m *Mutex) Lock() {
m.mu <- struct{
}{
}
}
func (m *Mutex) Unlock() {
<-m.mu
}
func main() {
mu := NewMutex()
inx := 0
wg := new(sync.WaitGroup)
wg.Add(100)
for i := 0; i < 100; i++ {
go func() {
defer wg.Done()
mu.Lock()
inx++
mu.