我想让我的程序更高效:我可以给*sync.Mutex一个结构变量一个变量,以便当我执行obj.Mutex.Lock()它时它只是锁定该特定对象上的 goroutines 操作?例子:package mainimport ( "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)}
1 回答

繁华开满天机
TA贡献1816条经验 获得超4个赞
因为每当我在任何互斥体上设置锁定时,所有变量都被锁定?
那没有任何意义。互斥体保持锁定状态。调用它的Lock()
和Unlock()
方法会根据它的状态来同步 goroutines。单独的互斥量值具有单独的不同状态。
将互斥锁添加到结构中是完全正常和常见的,您甚至可以将其嵌入:您何时将互斥锁嵌入到 Go 中的结构中?效果如您所愿:互斥锁可用于保护对包含结构值的并发访问,但不影响其他结构值。2 个并发的 goroutine 可能会更新 2 个单独的结构值,但不会超过 1 个 goroutine 会同时访问同一个结构值。
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消