使用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
相关文章推荐
- 用go的goroutine和channel实现一个简单的“生产、消费”(带有超时控制)小例子
- 【网络转载】Asp.net使用XPath实现一个简单的RSS阅读器
- 简单的使用自动化技术实现用WORD读取一个XML文件的过程~
- 一个Go语言接口和多操作系统实现的简单例子
- 使用common-pool实现的一个简单的线程池
- 使用UDP实现一个简单的聊天程序。
- 一个简单的信号量实现
- 使用Twisted实现一个简单Web服务器
- 使用HTML5简单实现一个JQuery
- 使用UIScrollView和UIPageControl实现一个简单的图片浏览功能
- Go语言实现的简单TCP服务及使用MySql
- Silverlight学习笔记一(理解一下机制,使用一下布局,实现一个简单的用户登录)
- 使用list实现一个简单的Listener管理
- 转[翻译]案例学习:仅使用Redis+PHP设计实现一个简单的Twitter
- 使用NLog实现一个简单的日志记录(包含源代码)
- 不使用man 3 printf的函数,实现一个简单的printf函数
- 使用gsoap实现一个简单的 QQ在线状态查询程序
- Thrift使用入门(2) - 用Thrift实现一个简单的Server/Client应用程序
- AsyncTask(1)一个使用AsyncTask实现简单异步刷新的功能。
- 使用pipe实现一个简单的类似tee命令的功能