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
}
相关文章
|
2月前
|
存储 安全 API
源码解密协程队列和线程队列的实现原理(二)
源码解密协程队列和线程队列的实现原理(二)
37 1
|
2月前
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
44 1
|
4月前
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
|
4月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
6月前
|
安全 Go 调度
协程(goroutine)和通道(channel)是其并发模型
协程(goroutine)和通道(channel)是其并发模型
34 0
|
安全 Java 容器
多线程案例(2)-阻塞式队列
多线程案例(2)-阻塞式队列
74 0
|
存储 Go
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
514 0
|
Go 调度
一文初探 Goroutine 与 channel
哈喽大家好,我是陈明勇,本文介绍的内容是 Go 并发模块的两个重要角色 → goroutine 与 channel。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
12420 0
一文初探 Goroutine 与 channel
|
Java
如何让线程池里面的线程按照顺序执行?
笔者今天看到一个有趣的面试题,如何让多个线程按照既定的顺序依次执行?比如每个线程输出一个整数,
697 0
|
安全 程序员 调度
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系?
进程,直观点说,保存在硬盘上的程序运行之后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。
185 0
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系?