超级苦工
阅读 125
golang利用channel实现线程同步互斥信号量

1、利用channel实现线程互斥

package main

import (
    "fmt"
    "sync"
)

var value int = 0

func add(ch chan struct{}, group *sync.WaitGroup) {
    ch <- struct{}{}
    value++
    <-ch
    group.Done()
}
func main() {
    var wg sync.WaitGroup
    var channel = make(chan struct{}, 1)
    wg.Add(10000)
    for i := 0; i < 10000; i++ {
        go add(channel, &wg)
    }
    wg.Wait()
    fmt.Println(value)
}

2、利用channel实现线程同步

package main

import (
    "fmt"
    "sync"
)

func funcA(ch chan struct{},group *sync.WaitGroup)  {
    fmt.Println("A函数执行完毕")
    ch<- struct{}{}
    group.Done()
}

func funcB(ch chan struct{},group *sync.WaitGroup)  {
    <-ch
    fmt.Println("B函数执行完毕")
    group.Done()
}
func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    ch:=make(chan struct{})
    go funcA(ch,&wg)
    go funcB(ch,&wg)
    wg.Wait()
}

3、利用channel实现信号量

package main

import (
    "fmt"
    "sync"
)

func funcA(ch chan struct{},group *sync.WaitGroup)  {
    <-ch
    fmt.Println("A函数执行完毕")
    ch<- struct{}{}
    group.Done()
}

func funcB(ch chan struct{},group *sync.WaitGroup)  {
    <-ch
    fmt.Println("B函数执行完毕")
    ch<- struct{}{}
    group.Done()
}
func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    ch:=make(chan struct{},1)
    ch<- struct{}{}
    go funcA(ch,&wg)
    go funcB(ch,&wg)
    wg.Wait()
}

评论
相关推荐
阿斯蒂芬萨芬的

55522 function app() { echo &#39;sdfsdf&#39;;...

阿斯蒂芬萨芬的

55522 function app() { echo &#39;sdfsdf&#39;; }...

浅谈Go类型转换之间的那些事

试着答一答这些问题 s[i]和(for _,v range)的v的区别是什么 var s string = &quot;AB&quot; fmt.Println(reflect.TypeOf(s[0]...

Kubernetes安装多master集群

...

MongoDB备份与还原

...

CentOS中安装mongo shell

添加官方 MongoDB 仓库 $ echo &#39;[mongodb-org-4.0] name=MongoDB Repository baseurl=https://repo.mongodb.o...

很漂亮的页面啊不错不错啊

很漂亮的页面啊不错不错啊...

在Kubernetes中部署第一个应用程序

...

在阿里云的ECS中安装Kubernetes

...

从0到1使用Kubernetes系列(二)——安装工具介绍

...

从0到1使用Kubernetes系列——Kubernetes入门

...

asdfasfdfd

asdfasdfsafd...

asdfafsdfsad

function sdf(){ echo &quot;sdffsdfds&quot;; }...

阿萨德飞

sdflkllsfdkj nihao...

【Golang+mysql】记一次mysql数据库迁移(一)

【Golang+mysql】记一次mysql数据库迁移(一) 文章地址:https://github.com/stayfoo/stayfoo-hub 一、准备 目标: 腾讯云 CVM 自建 mysql...

米粒社区系统什么部署?

发现现在一些功能还没开发或上线,不过感觉这个社区系统很强大,期待期待...

不错的网站

ceshi ceshi...

[译]想成为一个出色的Web工程师?学Golang而非Node.js。

原文: https://medium.com/codezillas/want-to-be-a-best-web-developer-learn-golang-not-node-js-69b4166d1...

跟我一起学习gRPC

扫描二维码,点击源码阅读菜单,跟我一起学习gRPC...

这个项目还会更新吗

这个项目github上1年多没有更新了...