我想让我的程序更高效:我可以给*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 关注
 - 152 浏览
 
添加回答
举报
0/150
	提交
		取消
	