使用go channel实现一个简单的信号量
Posted 绯浅yousa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用go channel实现一个简单的信号量相关的知识,希望对你有一定的参考价值。
使用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
以上是关于使用go channel实现一个简单的信号量的主要内容,如果未能解决你的问题,请参考以下文章