要求,使用读写锁sync.RWMutex + 两个协程,完成读写。
不能使用channel进行通信。
package main
import (
"sync"
"fmt"
" runtime "
)
type DemoData struct {
Data interface{}
rw sync.RWMutex
}
func (d *DemoData) write(input interface{}) {
d.Data = input
}
func (d *DemoData) read() interface{} {
return d.Data
}
func main() {
var wg = &sync.WaitGroup{}
d := new(DemoData)
j := 0
wg.Add(1)
runtime.GOMAXPROCS(1)
go func(wg *sync.WaitGroup, mutex *sync.RWMutex) {
defer wg.Done()
for i:=0; i<= 100; i++ {
if i == 100 {
// 设置结束标志,退出写,通过共享内存j,告诉读协程,写协程结束了。
j = -1
break
}
mutex.Lock()
d.write(i)
fmt.Println("---w:", i)
// 初始化j,表明,已经开始写数据了。 读协程,可以真正的读数据数据了。保证,先写数据,后读数据
j=1
mutex.Unlock()
runtime.Gosched()
}
}(wg, &d.rw)
wg.Add(1)
go func(wg *sync.WaitGroup, mutex *sync.RWMutex) {
defer wg.Done()
for {
if j == 0 {
// 保证只有有数据的时候,才真正的开始读
continue
}
if j < 0 {
// 说明,写协程,已经结束了,不再继续写了,你结束,我也结束
break
}
mutex.RLock()
fmt.Printf("----read:%v\n", d.read())
mutex.RUnlock()
runtime.Gosched()
}
}(wg, &d.rw)
wg.Wait()
}
为什么必须要有runtime.Gosched()呢?
大家,可以实际测试一下