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()
}
相关推荐
无限进步_几秒前
Linux进程等待——wait、waitpid与僵尸进程
linux·运维·服务器·开发语言
野生技术架构师3 分钟前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·设计模式
Wang ruoxi4 分钟前
Pygame 小游戏——数独
开发语言·python·pygame
人道领域10 分钟前
【LeetCode刷题日记】90.子集Ⅱ--- 归纳题解
java·开发语言·leetcode
sandnes14 分钟前
把ToolUse循环做到生产级-错误处理与可靠性五件套
后端
ch.ju16 分钟前
Java Programming Chapter 4——Characteristics of inheritance
java·开发语言
复园电子17 分钟前
企业PDF批量盖章开发集成指南:API对接OA/LIMS系统,高并发落地实战
开发语言·python·pdf
SunnyDays101122 分钟前
如何使用 C# 自动调整 Excel 行高和列宽
开发语言·c#·excel
掘金者阿豪24 分钟前
全维度拆解具身智能:底层技术 + 实战落地 + 全球产业竞争
后端
秋天的一阵风28 分钟前
✨ 代码秒跳转、自动补全?全靠 LSP 和 AST!
前端·后端·ai编程