七叶笔记 » golang编程 » golang面试题17之sync.RWMutex+两个协程完成依次读写

golang面试题17之sync.RWMutex+两个协程完成依次读写

要求,使用读写锁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()呢?

大家,可以实际测试一下

相关文章