golang仅在编写者进行更改时阻止读卡器

golang仅在编写者进行更改时阻止读卡器,go,concurrency,Go,Concurrency,我有一个编写器goroutine和多个阅读器goroutine。我想在writer更改数据时阻止读卡器 package main data []int func main() { m := sync.Mutex{} for i := 0; i< 10; i++ { go func reader() { for { m.Lock() myData := data

我有一个编写器goroutine和多个阅读器goroutine。我想在writer更改数据时阻止读卡器

package main

data []int

func main() {
    m := sync.Mutex{}

    for i := 0; i< 10; i++ {
        go func reader() {
            for {
                m.Lock()
                myData := data
                m.Unlock()
                read_from_data(myData)
            }
        }()
    }

    go func writer() {
        for {
            newData := new_data()
            m.Lock()
            data = newData
            m.Unlock()
            time.Sleep(1 * time.Seconds)
        }
    }
}
主程序包
数据[]整数
func main(){
m:=sync.Mutex{}
对于i:=0;i<10;i++{
go func阅读器(){
为了{
m、 锁()
myData:=数据
m、 解锁()
从_数据(myData)读取_
}
}()
}
go func编写器(){
为了{
newData:=新数据()
m、 锁()
数据=新数据
m、 解锁()
时间。睡眠(1*时间。秒)
}
}
}
我如何才能做到这一点,而不让读者互相阻塞?

这就是我的目的

它有两种不同的锁定方法:针对编写器的锁定方法和针对读卡器的锁定方法。(有两种不同的解锁方法,与不同的锁定方法相匹配:和。)

RWMutex
允许多个读卡器或一个写卡器。如果某个写入程序获得了锁,则在该写入程序解锁之前,不允许读卡器(同样,也不允许其他写入程序)。如果读卡器获得读锁,则允许任何其他读卡器(但不允许写入器,直到所有读卡器解锁)

m:=sync.RWMutex{}
对于i:=0;i<10;i++{
go func(){//reader
为了{
m、 RLock()
myData:=数据
m、 RUnlock()
从_数据(myData)读取_
}
}()
}
go func(){//writer
为了{
newData:=新数据()
m、 锁()
数据=新数据
m、 解锁()
时间。睡眠(1*时间。秒)
}
}
这就是它的用途

它有两种不同的锁定方法:针对编写器的锁定方法和针对读卡器的锁定方法。(有两种不同的解锁方法,与不同的锁定方法相匹配:和。)

RWMutex
允许多个读卡器或一个写卡器。如果某个写入程序获得了锁,则在该写入程序解锁之前,不允许读卡器(同样,也不允许其他写入程序)。如果读卡器获得读锁,则允许任何其他读卡器(但不允许写入器,直到所有读卡器解锁)

m:=sync.RWMutex{}
对于i:=0;i<10;i++{
go func(){//reader
为了{
m、 RLock()
myData:=数据
m、 RUnlock()
从_数据(myData)读取_
}
}()
}
go func(){//writer
为了{
newData:=新数据()
m、 锁()
数据=新数据
m、 解锁()
时间。睡眠(1*时间。秒)
}
}

使用a。使用a。正是我需要的,thanx表示快速回答正是我需要的,thanx表示快速回答
m := sync.RWMutex{}

for i := 0; i < 10; i++ {
    go func() { // reader
        for {
            m.RLock()
            myData := data
            m.RUnlock()
            read_from_data(myData)
        }
    }()
}

go func() { // writer
    for {
        newData := new_data()
        m.Lock()
        data = newData
        m.Unlock()
        time.Sleep(1 * time.Seconds)
    }
}