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()
}
相关推荐
鬼火儿1 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin1 小时前
缓存三大问题及解决方案
redis·后端·缓存
大佬,救命!!!2 小时前
C++多线程同步与互斥
开发语言·c++·学习笔记·多线程·互斥锁·同步与互斥·死锁和避免策略
赵文宇(温玉)2 小时前
构建内网离线的“github.com“,完美解决内网Go开发依赖
开发语言·golang·github
qq7422349842 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
Joker100852 小时前
仓颉自定义序列化:从原理到高性能多协议实现
开发语言
Adellle2 小时前
2.单例模式
java·开发语言·单例模式
间彧2 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧2 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
散峰而望2 小时前
C++入门(一)(算法竞赛)
c语言·开发语言·c++·编辑器·github