鍍金池/ 問答/GO/ golang sync.Mutex阻塞問題

golang sync.Mutex阻塞問題

package main

import (

"sync"

)

type data struct {

sync.Mutex

}
func (d data)test(s string){

d.Lock()
defer d.Unlock()
for i:=0;i<5 ;i++  {
    println(s,i)
    //time.Sleep(time.Second)
}

}
func test_lock(){

var wg sync.WaitGroup
wg.Add(3)
var d data
go func() {
    defer wg.Done()
    d.test("write")
}()
go func() {
    defer wg.Done()
    d.test("read")
}()
go func() {
    defer wg.Done()
    d.test("new")
}()
wg.Wait()

}
func main(){

test_lock()

}

clipboard.png
d.lock阻塞,不是應(yīng)該write全部打完再打印其他的嗎?為啥write打印一部分后new可以獲得鎖

回答
編輯回答
司令

func (d data)test(s string){

d.Lock()
defer d.Unlock()
for i:=0;i<5 ;i++ {

println(s,i)
//time.Sleep(time.Second)

}
}
指針的問題,(d data)相當(dāng)于復(fù)制了多個(gè)鎖給協(xié)程用,(d *data)就變成一個(gè)鎖,就沒問題了

2018年3月27日 14:20
編輯回答
空白格
func (d *data) test(s string) {

    d.Lock()
    defer d.Unlock()
    for i := 0; i < 5; i++ {
        println(s, i)
        //time.Sleep(time.Second)
    }
}

function (d data) test() 你這樣穿的是值, 所以得到是一份拷貝

2017年10月15日 07:53