没有静音的情况下,同时处理切片也无法正常工作



功能WithMutexWithoutMutex给出不同的结果。

WithoutMutex实现即使我设置了Waitgroup,也正在丢失值。

可能是什么问题?

不要在操场上运行

P.S。我在Windows 10上,进入1.8.1

package main
import (
    "fmt"
    "sync"
)
var p = fmt.Println
type MuType struct {
    list []int
    *sync.RWMutex
}
var muData *MuType
var data *NonMuType
type NonMuType struct {
    list []int
}
func (data *MuType) add(i int, wg *sync.WaitGroup) {
    data.Lock()
    defer data.Unlock()
    data.list = append(data.list, i)
    wg.Done()
}
func (data *MuType) read() []int {
    data.RLock()
    defer data.RUnlock()
    return data.list
}
func (nonmu *NonMuType) add(i int, wg *sync.WaitGroup) {
    nonmu.list = append(nonmu.list, i)
    wg.Done()
}
func (nonmu *NonMuType) read() []int {
    return nonmu.list
}
func WithoutMutex() {
    nonmu := &NonMuType{}
    nonmu.list = make([]int, 0)
    var wg = sync.WaitGroup{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go nonmu.add(i, &wg)
    }
    wg.Wait()
    data = nonmu
    p(data.read())
}
func WithMutex() {
    mtx := &sync.RWMutex{}
    withMu := &MuType{list: make([]int, 0)}
    withMu.RWMutex = mtx
    var wg = sync.WaitGroup{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go withMu.add(i, &wg)
    }
    wg.Wait()
    muData = withMu
    p(muData.read())
}
func stressTestWOMU(max int) {
    p("Without Mutex")
    for ii := 0; ii < max; ii++ {
        WithoutMutex()
    }
}
func stressTest(max int) {
    p("With Mutex")
    for ii := 0; ii < max; ii++ {
        WithMutex()
    }
}
func main() {
    stressTestWOMU(20)
    stressTest(20)
}

切片对于并发写入不安全,所以我绝对不会感到 WithoutMutex似乎根本不一致,并且已经丢弃了项目。

WithMutex版本始终具有10个项目,但以混乱的订单。这也是可以预料的,因为静音保护它只能一次添加。不能保证Goroutine将以哪种顺序运行,因此,要查看哪些快速产卵的Goroutines将首先附加。

WaitGroup不做任何事情来控制访问或执行订购。它只是在结束时提供了一个信号。

最新更新