Go并发多协程顺序打印

启动三个协程分别打印1、2、3,要求按照123123123123......的顺序打印出来,可以使用锁或者通道实现

用互斥锁实现

复制代码
package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	var mutex sync.Mutex
	count := 1
	for num := 1; num < 4; num++ {
		wg.Add(1)
		go func(n int) {
			defer wg.Done()
			for {
				mutex.Lock()
				if count == n {
					fmt.Print(count)
					count = count%3 + 1
				}
				mutex.Unlock()
			}
		}(num)
	}
	wg.Wait()
}

也可以用通道实现,channel分为有缓冲和无缓冲,内部封装了锁,读写通道是原子性的

无缓冲通道 :发送和接收都会阻塞,直到被接收或者通道有值

有缓冲通道:发送会在缓冲区未满时不阻塞,在缓冲区满时阻塞;接收同上

复制代码
package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	ch := make(chan int)
	defer close(ch)
	for num := 1; num < 4; num++ {
		wg.Add(1)
		go func(n int) {
			defer wg.Done()
			for {
				count := <-ch
				if count == n {
					fmt.Print(count)
					ch <- count%3 + 1
					continue
				}
				ch <- count
			}
		}(num)
	}
	ch <- 1
	wg.Wait()
}
相关推荐
lsx2024065 分钟前
Vue3 安装指南
开发语言
skywalk81636 分钟前
g4f JavaScript调用报错问题解决
开发语言·javascript·ecmascript
Tomhex9 分钟前
Go调用C代码的场景与实践
golang
qqty12179 分钟前
基于python语言的网页设计(手把手教你设计一个个人博客网站)
开发语言·python
Postkarte不想说话12 分钟前
LangChain使用入门
后端
xyyaihxl15 分钟前
将 vue3 项目打包后部署在 springboot 项目运行
java·spring boot·后端
耿雨飞15 分钟前
Python 后端开发技术博客专栏 | 第 02 篇 函数式编程与 Python 魔法 -- 闭包、装饰器、高阶函数
开发语言·python·装饰器·高阶函数·闭包
chenxu98b15 分钟前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
sunwenjian88615 分钟前
跨域问题解释及前后端解决方案(SpringBoot)
spring boot·后端·okhttp
网域小星球17 分钟前
C++ 从 0 入门(五)|C++ 面试必知:静态成员、友元、const 成员(高频考点)
开发语言·c++·面试·静态成员·友元函数