关于chan和sync.Mutex

假设 m map[string]interface{}需要频繁读,少量写。 如果使用chan的话,会导致效率低下。 如果用sync.Mutex来实现的话,要怎样才能提高效率又能保证读写同步呢?

目前有一个例子是这样:

func aaa(){

for key,value := range m{
      if key == "asd" {
           bbb(key)
      }
}

}

func bbb(key string){

// 加锁sync.Mutex.Lock()
// defer 解锁sync.Mutex.Unlock()
delete(m, key)

}

这个例子中的锁有起到读写锁的作用么? 请指教!

共 2 个回复


rn2dy

我测试了一下,的确可以。不过建议你不要用defer sync.Mutex.Unlock() 直接unlock在delete(m, key)后面就好,不然会慢很多。如果你的电脑只有一个CPU,那么下面这个程序有没有mutex都无所谓了(结果总是正确)。

package main

    import (
      "fmt"
      "sync"
      "runtime"
    )

    type Counter struct {
      mu sync.Mutex
      x int64
    }

    func (c *Counter) Inc(){
      c.mu.Lock()
      defer c.mu.Unlock()
      c.x++
    }


    func main() {
      runtime.GOMAXPROCS(runtime.NumCPU())

      c := Counter{}

      var wait sync.WaitGroup
      wait.Add(4)

      for k := 4; k > 0; k-- {
        go func(){
          for i := 2500000; i > 0; i-- {
            c.Inc()
          }
          wait.Done()
        }()
      }

      wait.Wait()

      fmt.Println(c.x)
    }
# 0

lzy7199

多谢指点!

# 1