您的位置:首页 > 编程语言 > Go语言

使用go channel实现一个简单的信号量

2017-04-26 01:21 337 查看

使用go channel实现一个简单的信号量

测试环境:mac

什么是信号量

信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。

信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。

介绍信号量的话,那么肯定不能不介绍P-V操作原语

P-V操作原语

P操作原语:

semaphore 减1

若semaphore 大于等于0,线程继续执行.

若semaphore < 0 ,线程进入阻塞队列.

V操作原语:

semaphore加1

若semaphore 大于 0, 线程继续执行

若semaphore 小于等于0,唤醒阻塞队例的线程

go简单实现

这里主要是实现互斥以及P-V操作原语

简单代码

package main

import (
"sync"
"fmt"
)

func main() {
wg := sync.WaitGroup{}
wg.Add(3)

sem := make(chan int, 1)

for i := 0; i < 3; i++ {
go func(id int) {
defer wg.Done()

sem <- 1

for x := 0; x < 3; x++ {
fmt.Println(id, x)
}

<-sem
}(i)
}

wg.Wait()
}


运行结果

feiqianyousadeMacBook-Pro:go yousa$ GOMAXPROCS=2 go run sem.go
2 0
2 1
2 2
0 0
0 1
0 2
1 0
1 1
1 2


参考资料

最全面的linux信号量解析

http://blog.csdn.net/qinxiongxu/article/details/7830537
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: