如题,使用条件变量Cond和channel通道实现多个生产者和消费者模型。Go语言天生带有C语言的基因,很多东西和C与很像,但是用起来 绝对比C语言方便。今天用Go语言来实现下多消费者和生产者模型。如果对C语言的多生产者和消费者模型感兴趣的可以看Linux系统编程:使用mutex互斥锁和条件变量实现多个生成者和消费者模型

代码实现

代码实现用了Cond条件变量和channel通道

package mainimport ("fmt""math/rand""sync""time"
)var cond sync.Cond//生产者
func produce(out chan<- int, nu int) {for {cond.L.Lock()//产品区满 等待消费者消费for len(out) == 3 {cond.Wait()}num := rand.Intn(1000)out <- numfmt.Printf("%dth ***producer produce***,num = %d,len(chan) = %d\n", nu, num, len(out))cond.L.Unlock()//生产了产品唤醒 消费者线程cond.Signal()//生产完了歇一会,给其他协程机会time.Sleep(time.Second)}
}//消费者
func consume(in <-chan int, nu int) {for {cond.L.Lock()//产品区空 等待生产者生产for len(in) == 0 {cond.Wait()}num := <-infmt.Printf("%dth ###consumer consume###,num = %d,len(chan) = %d\n", nu, num, len(in))cond.L.Unlock()cond.Signal()//消费完了歇一会,给其他协程机会time.Sleep(time.Millisecond * 500)}
}func main() {//设置随机数种子rand.Seed(time.Now().UnixNano())quit := make(chan bool)//产品区 使用channel模拟product := make(chan int, 3)//创建互斥锁和条件变量cond.L = new(sync.Mutex)//5个消费者for i := 0; i < 5; i++ {go produce(product, i)}//3个生产者for i := 0; i < 3; i++ {go consume(product, i)}//主协程阻塞 不结束<-quit
}

运行效果

Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型相关推荐

  1. Go语言中的条件变量Cond

    一.条件变量Cond的定义 Go语言里的条件变量,是一个结构体,它包括对应的方法和属性字段. Cond实现了⼀个条件变量,⼀个线程集合地,供线程等待或者宣布某事件的发⽣. 每个Cond实例都有⼀个相关 ...

  2. R语言编程 第一讲 变量与赋值

    R语言编程 第一讲 变量与赋值 R语言的变量名 赋值符号 <- 与 = 的区别 赋值符号 <- 的更多细节 Copy-on-Modify与Modify-in-Place 函数调用 列表 数 ...

  3. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

  4. linux条件变量cond,Linux C 条件变量cond的使用记录

    条件变量是实现线程间同步的一种方法,条件变量用来自动阻塞一个线程,直到收到收到一个cond信号或其它特殊情况发送,条件变量使用的时候必须与互斥量同时使用,这是为了保证条件量在线程间操作的"原 ...

  5. Linux之线程条件变量cond

    概念:条件变量不是锁,要和互斥量组合使用.条件变量就是生产者"生产"完成,消费者才能"使用",如果没有"产品",消费者就会被条件变量cond ...

  6. c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)

    目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...

  7. 条件变量存在的陷阱、生产者与消费者模型

    一.条件变量的使用 Linux下条件变量相关的API如下: pthread_cond_init:用于初始化条件变量. pthread_cond_destory:销毁条件变量. pthread_cond ...

  8. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  9. java suprious wakeup_多线程编程中条件变量和的spurious wakeup 虚假唤醒

    1. 概述 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 1)线程等待某 ...

最新文章

  1. select子句顺序
  2. PHP CURL 哈哈哈哈哈记录一下
  3. mysql5.7.20非安装版_mysql 5.7.20\5.7.21 免安装版安装配置教程
  4. 函数包装器,函数私有类处理
  5. 患者是否应该主动关注医疗知识
  6. C# 中 System.Range 结构体
  7. ajax请求 apend,jsp如何获取ajax append的数据?
  8. ubuntu14.04matlab2015b 测试caffe的Matlab接口
  9. js验证手机号码,邮箱,qq号
  10. 我用VS2015 开发webapp (1) 需求、目的、配置
  11. atoi,itoa,strcpy, strcmp,strcpy, strcpy_s, memc...
  12. em模型补缺失值_EM算法学习(三)
  13. 打印预览和实际的打印不一致问题
  14. 邮件群发软件如何群发邮件,企业邮箱可以吗?
  15. 联想服务器控制口登录地址_常用服务器管理口IP及账号密码(持续更新)
  16. php超链接打不开了,excel超链接无法打开怎么办
  17. 如何锻炼深入思考能力
  18. Convolutional Neural Network
  19. JS之replace与replaceAll
  20. Web前端教程学习笔记1.2-2022.10.17始

热门文章

  1. python刷题相关资料汇总(一)
  2. Python笔记-windows平台中Flask打包成exe
  3. Spring Boot文档阅读笔记-EhCache的使用
  4. Python笔记-BeautifulSoup通过查找Id获取元素信息
  5. Qt文档阅读笔记|Qt工作笔记-QMutexLocker的使用(抛出异常也能解锁)
  6. Java高级语法笔记-字符集与中文编码
  7. C/C++轻松实现文件下载
  8. C/C++ OpenCV之Laplacian边缘检测
  9. 3dmax体积雾渲染不出来_corona渲染,非常实用的小技巧
  10. vb6.0服务器组件安装失败,win10安装vb6.0总是失败怎么办?win10 vb6.0安装不了的解决办法...