• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go条件变量和互斥锁结合channel使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

var cond sync.Cond // 定义全局条件变量

func product(out chan<- int, index int) {
    for {
        // 先加锁
        cond.L.Lock()
        // 判断缓冲区是否满
        for len(out) == 5 {
            // a)阻塞等待条件变量满足
            // b)释放已掌握的互斥锁相当于cond.L.Unlock()。 注意:两步为一个原子操作。
            // c)当被唤醒,Wait()函数返回时,解除阻塞并重新获取互斥锁。相当于cond.L.Lock()
            cond.Wait()
        }
        num := rand.Intn(1000)
        out <- num
        fmt.Printf("生产者%dth,生产:%d\n", index, num)
        // 访问公共区结束,并且打印结束,解锁
        cond.L.Unlock()
        // 唤醒阻塞在条件变量上的 消费者
        cond.Signal()
        time.Sleep(time.Millisecond * 300)
    }
}

func consumer(in <-chan int, index int) {
    for {
        // 先加锁
        cond.L.Lock()
        // 判断 缓冲区是否为空
        for len(in) == 0 {
            // a)阻塞等待条件变量满足
            // b)释放已掌握的互斥锁相当于cond.L.Unlock()。 注意:两步为一个原子操作。
            // c)当被唤醒,Wait()函数返回时,解除阻塞并重新获取互斥锁。相当于cond.L.Lock()
            cond.Wait()
        }
        num := <-in
        fmt.Printf("----消费者%dth,消费:%d\n", index, num)
        // 访问公共区结束后,解锁
        cond.L.Unlock()
        // 唤醒 阻塞在条件变量上的 生产者
        cond.Signal()
        time.Sleep(time.Millisecond * 200)
    }
}

func main() {
    ch := make(chan int, 5)
    quit := make(chan bool)
    rand.Seed(time.Now().UnixNano())
    // 指定条件变量 使用的锁
    cond.L = new(sync.Mutex)
    for i := 0; i < 5; i++ {
        go product(ch, i+1)
    }
    for i := 0; i < 5; i++ {
        go consumer(ch, i+1)
    }
    <-quit
}

打印:

生产者1th,生产:386
----消费者5th,消费:386
生产者3th,生产:975
----消费者1th,消费:975
生产者2th,生产:615
----消费者3th,消费:615
生产者4th,生产:207
生产者5th,生产:140
----消费者2th,消费:207
----消费者4th,消费:140

..................


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言学习---字符串与数组类型变量发布时间:2022-07-10
下一篇:
Go字符串函数发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap