超级苦工
阅读 48
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()
}

评论
相关推荐
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年多没有更新了...

golang123报错问题

报图上错误,怎么解...

【开源】gnet: 一个轻量级且高性能的 Golang 网络库

Github 主页 https://github.com/panjf2000/gnet 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和...

t2

tttttttttttttttttttttttt...

test

123456789...

读 "优雅关闭的 Go Web 服务器"

读 &quot;优雅关闭的 Go Web 服务器&quot; GitHub 仓库:https://github.com/stayfoo/stayfoo-hub 文章《优雅的关闭 Go Web 服务器》...

golang123监控安装配置

有问题同学将golang123的源码中的statsD安装配置成功的,分享一下配置过程呗。...

Golang Modules官方包管理

1 设置环境变量 GO111MODULE=auto2 初始化项目 go mod init my_project3 针对国外无法访问的包设置代理 GOPROXY=https://goproxy.io其他...

猎豹移动,直播业务,招聘 Golang 工程师【北京】

我的微信是 legenove, 邮箱是 liuguoyang@cmcm.com 我是这个团队的 leader,直接给自己团队招聘。 职位要求: 1.熟练掌握 Golang 语言,并有 2 年以上中大型...

部署后登录 Request failed with status code 404

Request failed with status code 404 怎么解决...

[深圳 梦享网路 ] Golang开发工程师招聘

岗位介绍 ** 如有意向:请联系: 陈小姐:TEL:18620870779 邮箱:chenpeiwen@clickwifi.net ** 办公地点:深圳市南山区软件产业基地科园路中科纳能大厦A栋403...

golang + qt5 开发的百度网盘不限速客户端

百度网不限速客户端,使用golang + qt5 开发,跨平台。代码注释详细,并有附有开发文档,gopher们快来支持下吧 官网: https://github.com/peterq/pan-ligh...