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()
}
相关推荐
我不会写代码njdjnssj27 分钟前
网络编程 TCP UDP
java·开发语言·jvm
ai小鬼头1 小时前
百度秒搭发布:无代码编程如何让普通人轻松打造AI应用?
前端·后端·github
考虑考虑1 小时前
@FilterRegistration和@ServletRegistration注解
spring boot·后端·spring
一只叫煤球的猫1 小时前
🔥 同事混用@Transactional和TransactionTemplate被我怼了,三种事务管理到底怎么选?
java·spring boot·后端
李少兄9 天前
解决OSS存储桶未创建导致的XML错误
xml·开发语言·python
阿蒙Amon9 天前
《C#图解教程 第5版》深度推荐
开发语言·c#
学Linux的语莫9 天前
python基础语法
开发语言·python
你的人类朋友9 天前
(●'◡'●)从Dockerfile快速入门Docker Compose
后端
暖馒9 天前
C#委托与事件的区别
开发语言·c#
GetcharZp9 天前
「神器推荐」Rclone:轻松玩转云端存储,FTP 也能飞起来!
后端