golang 仅在作者进行更改时才阻止读者

标签 go concurrency

我有一个 writer goroutine 和多个 reader goroutine。我想在写入器更改数据时阻止读取器。

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)
        }
    }
}

我怎样才能做到不让读者互相阻塞?

最佳答案

这就是sync.RWMutex是为了。

它有两种不同的锁定方式:RWMutex.Lock()对于作家,和RWMutex.RLock()对于读者。 (并且有2种不同的解锁方式,对应不同的锁定方式:RWMutex.Unlock()RWMutex.RUnlock()。)

RWMutex 允许多个读取器或 1 个写入器。如果写入者获得了锁,则在写入者解锁之前不允许读取者(也不允许其他写入者)。如果一个读者获得读锁,则允许任何其他读者(但不是一个作者,直到所有读者解锁)。

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)
    }
}

关于golang 仅在作者进行更改时才阻止读者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372151/

相关文章:

go - 在 Hugo 中使用部分时破折号

go - 为什么golang中的关键字范围适用于2d slice ?

java - 拒绝同线程可重入但允许异线程可重入的锁

go - 带有 O_CREATE 标志的 os.OpenFile 抛出没有这样的文件或目录

go - Golang Base64签名验证VS CryptoJS

go - Go 中连接前导零的惯用方法

multithreading - 托管语言和运行时的 future 保护

java - Collectors.joining (",") 是线程安全的吗?

scala - 如何处理 Actor 的爆发?

java - 停止 ScheduledThreadPoolExecutor Java 中的 sheduleAtFixedRate 任务