为了账号安全,请及时绑定邮箱和手机立即绑定

我可以使用 *sync.Mutex 作为对象特定变量吗?

我可以使用 *sync.Mutex 作为对象特定变量吗?

Go
慕丝7291255 2022-06-01 10:03:42
我想让我的程序更高效:我可以给*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 会同时访问同一个结构值。


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号