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()
}
相关推荐
离陌在学C#15 小时前
C# 事件(Event)详解:从概念到实战
开发语言·c#
To_OC15 小时前
Next.js + Redis 构建笔记系统:Redis Hash 实战与性能优化
redis·后端·next.js
Terra.K15 小时前
Java异常学习[特殊字符]
java·开发语言·学习
葡萄城技术团队17 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
counting money17 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk55517 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无18 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率11520018 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
程序员小八77718 小时前
上海百度B端java后端日常实习一面
java·开发语言
北斗落凡尘18 小时前
LangGraph 入门实战(11)--输出模式
后端·python·langchain