美文网首页Golang合集
Go语言学习五:异步、同步、锁

Go语言学习五:异步、同步、锁

作者: 孙小兵 | 来源:发表于2018-01-13 18:52 被阅读319次

    一 、异步、同步控制

    在Go中并行与并发是有区别的,详细请参考Go 并发 、并行、线程池, 通过信道的方式来实现同步  譬如 var change  =make( chan int), 而后对此信道进行数据读写且信道读写是阻塞式的。

    varchange =make(chanint)

    typeMessagestruct{

    idint

    datastring

    dofunc(prestring,idint)

    }

    funcaddMessage(reqstring,m Message) {

    m.do(req+m.data,m.id)

    }

    funcmain() {

    //查询当前运行使用CPU数量

    fmt.Println("设定本机可用CPU的数量:",runtime.NumCPU())

    //设定当前CPU 可使用的数量

    runtime.GOMAXPROCS(4)

    varn =1

    task := Message{id: n,data:"i am message"}

    task.do =func(prestring,idint) {

    fmt.Println(id,pre)

    change <-1

    }

    goaddMessage("welcome",task)

    <-change

    }

    二 锁机制

    /**

    sync 包中实现了两个关于锁的数据类型,sync.Mutex 和 sync.RWMutex。[ 互斥锁 mutex 是独占型,只能 lock 一次, unlock 一次,

    然后才能继续 lock 否则阻塞。

    读写互斥锁 reader-writer mutex 是所有的 reader 共享一把锁或是一个 writer 独占一个锁,

    如果一个 reader lock 到锁了, 其他的 reader 还可以 lock 但是 writer 不能 lock 。 ]

    对于 sync.Mutex 或是 sync.RWMutex 类型的变量 mutex 来说,假定 n < m,

    对于 mutex.Unlock() 的第 n 次调用在 mutex.Lock() 的第 m 次调用返回之前发生。

    [ 对于一个 mutex 来说,lock 一下,第二次 lock 会阻塞,只有 unlock 一下才可以继续 lock,就是这个意思。

    然而 unlock 一个没有 lock 的 mutex 会怎么样呢?error ! ]

    */

    varl sync.Mutex

    funcfoo()  {

    fmt.Println("hello,world")

    l.Unlock()

    }

    funcmain() {

    fmt.Println("1")

    l.Lock()

    gofoo()

    fmt.Println(3)

    l.Lock()

    fmt.Println("2")

    }

    相关文章

      网友评论

        本文标题:Go语言学习五:异步、同步、锁

        本文链接:https://www.haomeiwen.com/subject/umneixtx.html