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()
}
相关推荐
我命由我12345几秒前
Java 开发 - Objects 的 requireNonNull 方法
java·服务器·开发语言·后端·学习·java-ee·学习方法
想做后端的前端2 分钟前
Lua的热更新
开发语言·lua
隐退山林14 分钟前
JavaEE初阶:多线程进阶
java·开发语言
lead520lyq16 分钟前
Golang Protoc Grpc实现微服务通信
开发语言·微服务·golang
BHXDML17 分钟前
Python:(一)变量、类型与 f-string —— 数据的载体
开发语言·python
学嵌入式的小杨同学28 分钟前
【Linux 实战】Makefile 自动化构建进阶:静态库 / 动态库通用模板(一键编译 + 系统安装)
linux·开发语言·git·vscode·spring·vim·ux
小孟的CDN29 分钟前
一维热传导方程的PINN求解——损失函数实时绘制
开发语言·python
透明的玻璃杯32 分钟前
VS2015+QT5程序发布
开发语言·qt
短剑重铸之日33 分钟前
《SpringCloud实用版》SpringCloud Alibaba和SpringCloud的区别
后端·spring·spring cloud·sca
爱学习的阿磊38 分钟前
自定义操作符重载指南
开发语言·c++·算法