当前位置: 首页 > article >正文

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()
}


http://www.kler.cn/news/365645.html

相关文章:

  • 【算法设计与分析】-回溯法的回忆-学习【期末复习篇章】
  • 代理与 Hubstudio 集成
  • 文本预处理——构建词云
  • 【移动应用开发】界面设计(二)实现水果列表页面
  • 400V交流智能剩余电流监测系统设计与应用
  • 【记录】VSCode|自用设置项
  • LeetCode:2747. 统计没有收到请求的服务器数目(滑动窗口 Java)
  • R语言实现随机森林分析:从入门到精通
  • C++简介和基本语法介绍
  • [实时计算flink]IntervalJoin语句
  • 查找算法和排序算法
  • Django+Vue全栈开发项目入门(二)
  • Git版本控制
  • 前沿技术与未来发展第一节:C++与机器学习
  • less 命令无法正确显示中文字符问题
  • 探索 DevOps:从概念到实践
  • java中使用redis的方法
  • ClickHouse在百度MEG数据中台的落地和优化
  • disabled_button
  • 死锁(Deadlock)C#
  • 什么是js中的入口函数
  • Apache HttpClient 和 OkHttpClient 的使用
  • 青少年编程与数学 02-002 Sql Server 数据库应用 13课题、函数的编写
  • Mac电脑:资源库Library里找不到WebServer问题的解决
  • Appium中的api(三)
  • AIGC:开启智能创造的璀璨新篇章