关于go:golang-用channel做锁

当chanel的容量为1的时候能够作为锁来实现一些原子操作

比方 咱们想实现一个+1的协程 还要保障原子性 就能够这样:

package main

import (
    "fmt"
    "time"
)

func main() {
    test_chan := make(chan bool, 1) //这里容量设为1
    var x int
    for i := 0; i < 1000; i++ {
        go rise(test_chan, &x)
    }
    time.Sleep(time.Second) //用mutex更佳
    fmt.Println("the value of x is : ", x)
}
//因为要扭转原来x的值 所以这里要应用指针
//因为信道的容量为1 所以写数据后 进行原子操作 而后立马数据推出去
func rise(ch chan bool, x *int) {
    ch <- true
    *x = *x + 1
    <-ch
}

运行后果:

the value of x is : 1000


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理