goroutine+channel实现对多个goroutine的顺序执行

简介: goroutine+channel实现对多个goroutine的顺序执行

问:

要求创建三个函数分别打印,“dog”,“cat”,“fish”,
要求每个函数起一个goroutine,请按照dog,cat,fish的顺序,打印四次,输出到控制台。

代码:

package main

import (
    "fmt"
)

func main() {
   
    dogCh := make(chan bool, 1) //给一个1的缓存区是为了暂存fish函数最后发生的一个true
    catCh := make(chan bool)
    fishCh := make(chan bool)
    exitch := make(chan bool)
    go func() {
   
        for i := 0; i < 4; i++ {
   
            if <-dogCh {
   
                fmt.Println("dog")
                catCh <- true
            }
        }
    }()

    go func() {
   
        for i := 0; i < 4; i++ {
   
            if <-catCh {
   
                fmt.Println("cat")
                fishCh <- true
            }
        }
    }()
    go func() {
   
        defer close(exitch) //在协程最后close exit给出信号协程执行完毕,避免主go结束协程未跑完造成死锁
        for i := 0; i < 4; i++ {
   
            if <-fishCh {
   
                fmt.Println("fish")
                dogCh <- true
            }
        }
    }()
    dogCh <- true
    <-exitch
}
AI 代码解读
目录
打赏
0
0
0
0
2
分享
相关文章
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
82 1
源码解密协程队列和线程队列的实现原理(二)
源码解密协程队列和线程队列的实现原理(二)
58 1
|
7月前
|
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
9月前
|
协程(goroutine)和通道(channel)是其并发模型
协程(goroutine)和通道(channel)是其并发模型
47 0
面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?
面试知识点:notify是随机唤醒线程吗(唤醒线程顺序)?
281 0
一文初探 Goroutine 与 channel
哈喽大家好,我是陈明勇,本文介绍的内容是 Go 并发模块的两个重要角色 → goroutine 与 channel。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
12465 0
一文初探 Goroutine 与 channel
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
535 0
高并发编程-线程通信_使用wait和notify进行线程间的通信
高并发编程-线程通信_使用wait和notify进行线程间的通信
128 0
join线程执行结束之后,并没有看到哪里有notify方法,请问此时谁去唤醒等待池中的线程
Java中的join方法,阻塞当前线程,直到join线程结束后才继续执行。底层是通过wait来实现的,join线程执行结束之后,并没有看到哪里有notify方法,请问此时谁去唤醒等待池中的线程(join之前的那个“当前”线程)呢?
120 0
join线程执行结束之后,并没有看到哪里有notify方法,请问此时谁去唤醒等待池中的线程