【问题标题】:Can I use *sync.Mutex as an object specific variable?我可以使用 *sync.Mutex 作为对象特定的变量吗?
【发布时间】:2020-07-31 21:44:16
【问题描述】:

我想让我的程序更高效:
我可以将*sync.Mutex 变量赋予一个结构,这样当我执行obj.Mutex.Lock() 时,它只会锁定该特定对象上的goroutines 操作吗?

示例:

package main

import (
    "fmt"
    "sync"
    "time"
)

type mystruct struct {
    Counter int
    Mutex   *sync.Mutex
}

func (obj *mystruct) incrementCount() {
    for i := 0; i < 1000; i++ {
        obj.Mutex.Lock()
        obj.Counter++
        time.Sleep(time.Microsecond)
        obj.Mutex.Unlock()
    }
    fmt.Println("incrementCount returns")
}

func funcNotSensibleToMutex() {
    n := 0
    for i := 0; i < 1000; i++ {
        n++
        time.Sleep(time.Microsecond)
    }
    fmt.Println("returns first since it's not affected by mutex")
}

func main() {
    a := &mystruct{0, &sync.Mutex{}}
    go a.incrementCount()
    go a.incrementCount()
    go funcNotSensibleToMutex()

    time.Sleep(time.Duration(5) * time.Second)
    fmt.Println("a counter", a.Counter)
}

【问题讨论】:

    标签: go struct locking mutex goroutine


    【解决方案1】:

    因为每当我在任何互斥体上设置锁定时,所有变量都会被锁定?

    那没有任何意义。互斥体保持锁定状态。调用它的 Lock()Unlock() 方法会根据其状态同步 goroutine。单独的互斥量值具有单独的不同状态。

    将互斥锁添加到结构中是完全正常和普遍的,您甚至可以将其嵌入:When do you embed mutex in struct in Go? 效果是您所期望的:互斥锁可用于保护对包含结构值的并发访问,但其他结构值不受影响。 2 个并发的 goroutine 可能会更新 2 个单独的结构值,但不会超过 1 个 goroutine 会同时访问同一个结构值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2019-02-14
      • 2012-08-05
      • 1970-01-01
      • 2017-02-27
      相关资源
      最近更新 更多