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

标签: Go语言编程 Cond条件变量 多生产者和消费者模型 channel通道
29人阅读 评论(0) 收藏 举报
分类:

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

代码实现

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

package main

import (
	"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 <- num
		fmt.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 := <-in
		fmt.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
}

运行效果



查看评论

golang生产者与消费者

使用golang可以很容易实现,生产者与消费者功能。实现一:(只生产一定数量数据)//写入专用通道 //一次写10条 func produce(p chan...
  • e421083458
  • e421083458
  • 2016-09-28 17:53:24
  • 926

线程同步:条件变量实现生产者消费者模型

概念:   假设实现一个生产者消费者模型,仓库只能装100万件item,生产者每次生产1件,消费者每次消费1件,为了保持数据的同步,那么生产者每次都需要检查仓库是否满了,消费者每次都需要检查仓库是否空...
  • daiyudong2020
  • daiyudong2020
  • 2016-01-05 22:23:38
  • 970

用条件变量来解决生产者消费者问题

在上一篇文章中,我使用了匿名信号量什么是条件变量? 我们可以设想一个场景:线程A需要某个条件成立才能继续执行,否则一直等待下去,而线程B执行过程中使线程的执行条件成立,并且唤醒A。 举个例...
  • chen_mama
  • chen_mama
  • 2015-08-11 23:09:15
  • 1403

Linux多线程消费者和生产者模型实例(互斥锁和条件变量使用)

条件变量与互斥锁使用,生产者和消费者模型
  • Linux_ever
  • Linux_ever
  • 2015-12-08 11:41:55
  • 2834

c++11多线程 生产者-消费者模型/条件变量condition_variable

在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就...
  • AXuan_K
  • AXuan_K
  • 2016-07-20 21:18:48
  • 3112

go goroutine 简单实现生产者和消费者

原文:http://blog.csdn.net/deus_ex_machina/article/details/57074583 package main import (    ...
  • hyl999
  • hyl999
  • 2017-08-15 23:21:26
  • 339

Linux生产者消费者模型--基于线程条件变量

生产者和消费者之间用中间类似一个队列一样的东西串起来。这个队列可以想像成一个存放产品的“仓库”,生产者只需要关心这个“仓库”,并不需要关心具体的消费者,对于生产者而言甚至都不知道有这些消费者存在。对于...
  • u014427196
  • u014427196
  • 2016-09-13 02:01:35
  • 308

Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

Linux多线程编程(一):http://blog.csdn.net/llzk_/article/details/55670172 Linux多线程编程(二):http://blog.csdn.ne...
  • LLZK_
  • LLZK_
  • 2017-02-22 21:02:27
  • 2019

Go语言模拟一个生产者消费者的Demo

packagemain   import ( "fmt" "math/rand" "time" )   typeproducer struct { id int level int }   ...
  • qwertyupoiuytr
  • qwertyupoiuytr
  • 2017-02-14 16:29:39
  • 1102

LinuxC语言实现生产者和消费者模型

  • 2010年08月30日 11:14
  • 3KB
  • 下载
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 11万+
    积分: 2522
    排名: 1万+
    博客专栏
    最新评论