交替打印-GO

1 两个channel 版本

package main

import ("fmt"
	   "sync")

var wg sync.WaitGroup
var c1 chan int
var c2 chan int

func A(){
	defer wg.Done()
	for i:=0;i<10;i++ {
		<-c1
		fmt.Println(2*i)
		c2<-1            //牵引协程
	}
}
func B(){
	defer wg.Done()
	for i:=0;i<10;i++ {
		<-c2
		fmt.Println(2*i+1)
		c1<-1
	}
}
func main () {
	wg = sync.WaitGroup{}  //初始化
	c1 = make(chan int, 1)  //有缓存,不然会死锁
	c2 = make(chan int)
	wg.Add(2)
	
	go A()   //协程执行函数
	go B()
	
	c1<-1      //启动协程
	wg.Wait()
	
	fmt.Println("hello https://tool.lu/")
}

无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。
这种类型的通道要求发送 goroutine 和接收 goroutine同时准备好,才能完成发送和接收操作。

如果都使用无缓冲通道,需要小修一下B()函数,避免死锁。
package main

import ("fmt"
	   "sync")

var wg sync.WaitGroup
var c1 chan int
var c2 chan int

func A(){
	defer wg.Done()
	for i:=0;i<10;i++ {
		<-c1
		fmt.Println(2*i)
		c2<-1
	}
}
func B(){
	defer wg.Done()
	for i:=0;i<10;i++ {
		<-c2
		fmt.Println(2*i+1)
		if i < 9 {   //临结束时候,不再写入
			c1<-1
		}
	}
}
func main () {
	wg = sync.WaitGroup{}
	c1 = make(chan int)
	c2 = make(chan int)
	wg.Add(2)
	
	go A()
	go B()
	
	c1<-1
	wg.Wait()
	
	
	fmt.Println("hello https://tool.lu/")
}

2  1个通道版本

  • 奇偶打印条件过滤
  • 管道自牵引
package main

import ("fmt"
	   "sync")

var wg sync.WaitGroup
var c1 chan int

func A(){
	defer wg.Done()
	for i:=0;i<10;i++ {
		<-c1
		if i%2 == 0 {
			fmt.Println(i)
		}
	}
}
func B(){
	defer wg.Done()
	for i:=0;i<10;i++ {
		c1<-1
		if i%2 == 1 {
			fmt.Println(i)
		}
	}
}
func main () {
	wg = sync.WaitGroup{}
	c1 = make(chan int)
	wg.Add(2)

	go A()
	go B()

	wg.Wait()

	fmt.Println("hello https://tool.lu/")
}

3 不使用 channel

package main

import ("fmt"
	   "sync")

var wg sync.WaitGroup
var i int

func A(){
	defer wg.Done()
	for ;i<10; {

		if i%2 == 0 {
			fmt.Println(i)
			i++
		}
	}
}
func B(){
	defer wg.Done()
	for ;i<10; {

		if i%2 == 1 {
			fmt.Println(i)
			i++
		}
	}
}
func main () {
	wg = sync.WaitGroup{}
	i = 0
	wg.Add(2)

	go A()
	go B()

	wg.Wait()

	fmt.Println("hello https://tool.lu/")
}

相关推荐

  1. 交替打印-GO

    2024-07-10 13:14:04       32 阅读
  2. go面试题--使用两个goroutine交替打印数字与字母

    2024-07-10 13:14:04       58 阅读
  3. 多线程交替打印

    2024-07-10 13:14:04       121 阅读
  4. GO日志打印添加goroutineid

    2024-07-10 13:14:04       38 阅读
  5. go语言打印出变量的类型

    2024-07-10 13:14:04       24 阅读
  6. n个协程交替打印1-100,详细注释

    2024-07-10 13:14:04       41 阅读
  7. Go Build编译打包文件

    2024-07-10 13:14:04       46 阅读
  8. Golang_交替打印ABC\奇偶数\1-10\字母(并发编程)

    2024-07-10 13:14:04       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 13:14:04       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 13:14:04       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 13:14:04       90 阅读
  4. Python语言-面向对象

    2024-07-10 13:14:04       98 阅读

热门阅读

  1. 秒验 iOS端如何修改授权页背景

    2024-07-10 13:14:04       29 阅读
  2. 探索HTML5的设计原则:引领Web开发的未来方向

    2024-07-10 13:14:04       23 阅读
  3. hive 调优

    2024-07-10 13:14:04       24 阅读
  4. 精通C#编程需要学习哪些常用框架?

    2024-07-10 13:14:04       27 阅读
  5. Redis高可用解决方案哨兵模式与集群模式的比较

    2024-07-10 13:14:04       28 阅读
  6. C#实用的工具类库

    2024-07-10 13:14:04       30 阅读
  7. 4085行代码还原2D我的世界(上)

    2024-07-10 13:14:04       21 阅读
  8. 大数据面试题之GreenPlum(1)

    2024-07-10 13:14:04       21 阅读
  9. 量化机器人能否识别市场机会?

    2024-07-10 13:14:04       25 阅读