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
}
相关文章
|
6天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
1月前
|
安全 Go 数据处理
掌握Go语言并发:从goroutine到channel
在Go语言的世界中,goroutine和channel是构建高效并发程序的基石。本文将带你一探Go语言并发机制的奥秘,从基础的goroutine创建到channel的同步通信,让你在并发编程的道路上更进一步。
|
3月前
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
|
5月前
|
安全 Go 调度
协程(goroutine)和通道(channel)是其并发模型
协程(goroutine)和通道(channel)是其并发模型
29 0
|
6月前
|
大数据 Go
goroutine
Goroutine 是 Go 语言中的一种轻量级线程,由 Go runtime 管理。它们非常轻量,创建和销毁的开销很小,同时它们之间的切换也非常高效。Goroutine 的使用可以极大地提高程序的并发性能,使得
40 3
|
存储 Go
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理
505 0
|
Go 调度
一文初探 Goroutine 与 channel
哈喽大家好,我是陈明勇,本文介绍的内容是 Go 并发模块的两个重要角色 → goroutine 与 channel。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
12406 0
一文初探 Goroutine 与 channel
|
Go
Go channel被关闭时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题
Go channel被关闭时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题
175 0
|
Java
如何让线程池里面的线程按照顺序执行?
笔者今天看到一个有趣的面试题,如何让多个线程按照既定的顺序依次执行?比如每个线程输出一个整数,
681 0
|
安全 程序员 调度
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系?
进程,直观点说,保存在硬盘上的程序运行之后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。
175 0
Goroutine 是什么?进程、线程、协程又是什么?有什么区别和联系?