忙碌-尽管已由互斥锁处理,但软件并发恐慌并发访问

时间:2018-10-09 17:57:05

标签: dictionary go concurrency mutex

我有一个不断被3个goroutine读写的映射,尽管我设置了互斥量来保护它,但该程序始终以“致命错误:并发映射迭代和映射写”结束使用sync.Map或我可以与频道同步,但是我真的很想了解自己在做什么错。这是代码:

//book.go
type OrderbookMap map[float64]float64

type Orderbook struct {
    Bids     OrderbookMap
    Asks     OrderbookMap
    Symbol   string
    IsInit   bool
    UpdateId int
    mu sync.Mutex
}

func (book *Orderbook) Init() {

    book.mu.Lock()
    defer book.mu.Unlock()

    if book.IsInit {
        return
    }
    book.Asks = make(OrderbookMap)
    book.Bids = make(OrderbookMap)
    book.IsInit = true
}
//functions with mutexes
func DelBid2(b *Orderbook, price float64) {
    b.mu.Lock()
    defer b.mu.Unlock()
    if _, ok := b.Bids[price]; ok {
        delete(b.Bids, price)
    } else {
        fmt.Printf("VALUE NOT FOUND %v\n", price)
    }
}


func AddBid2(b *Orderbook, price float64, qty float64) {
    b.mu.Lock()
    defer b.mu.Unlock()
    b.Bids[price] = qty
}


func GetBids2(b *Orderbook) OrderbookMap {
    b.mu.Lock()
    defer b.mu.Unlock()
    return b.Bids
}

//TesterFile.go
func TestBookRace(t *testing.T) {
    var B Orderbook
    B.Init()
    //add
    go func() {
        for {
            b, q := rFloat(), rFloat()
            AddBid2(&B, b, q)
            fmt.Printf("ADD %v NEW: %v\n", b, GetBids2(&B))
        }
    }()
    //del
    go func() {
        for {
            b := rFloat()

            DelBid2(&B, b)
            fmt.Printf("DEL %v NEW: %v\n", b, GetBids2(&B))
        }
    }()
    //read
    go func() {
        for {
            fmt.Printf("READ %v\n", GetBids2(&B))
        }
    }()


    for { time.Sleep(10 * time.Second)}
}

0 个答案:

没有答案