golang 协程题目

都是一个货色,要么使用无缓冲channel, 要么使用有缓冲chan+waitgroup等待协程退出,或者使用全局变量判断是否终止协程

2个协程交替打印奇数和偶数

无缓冲channel实现

go 复制代码
package main

import "fmt"

func main() {

	maxval := 10
	ch1 := make(chan struct{})
	ch2 := make(chan struct{})
	close := make(chan struct{})
	go func() {
		for i := 1; i <= maxval ; i++ {
			if i%2 == 1 {
				<-ch1
				fmt.Printf("%d\n", i)
				ch2 <- struct{}{}
			}
		}
	}()
	go func() {
		for i := 1; i <= maxval ; i++ {
			if i%2 == 0 {
				<-ch2
				fmt.Printf("%d\n", i)

				if i == maxval {
					close <- struct{}{}
				} else {
					ch1 <- struct{}{}
				}
			}
		}
	}()

	ch1 <- struct{}{}
	<-close
}

有缓冲channel实现

go 复制代码
package main

import "fmt"

func main() {

	maxval := 10
	ch1 := make(chan struct{}, 1)
	ch2 := make(chan struct{}, 1)
	close := make(chan struct{})
	go func() {
		for i := 1; i <= maxval; i++ {
			if i%2 == 1 {
				<-ch1
				fmt.Printf("%d\n", i)
				ch2 <- struct{}{}
			}
		}
	}()
	go func() {
		for i := 1; i <= maxval; i++ {
			if i%2 == 0 {
				<-ch2
				fmt.Printf("%d\n", i)
				ch1 <- struct{}{}
			}
		}
		close <- struct{}{}
	}()

	ch1 <- struct{}{}
	<-close
}

有缓冲channel+ waitgroup

go 复制代码
package main

import (
	"fmt"
	"sync"
)

func main() {

	maxval := 10
	ch1 := make(chan struct{}, 1)
	ch2 := make(chan struct{}, 1)
	wg := &sync.WaitGroup{}
	wg.Add(2)
	go func() {
		defer wg.Done()
		for i := 1; i <= maxval; i++ {
			if i%2 == 1 {
				<-ch1
				fmt.Printf("%d\n", i)
				ch2 <- struct{}{}
			}
		}
	}()
	go func() {
		defer wg.Done()
		for i := 1; i <= maxval; i++ {
			if i%2 == 0 {
				<-ch2
				fmt.Printf("%d\n", i)
				ch1 <- struct{}{}
			}
		}
	}()

	ch1 <- struct{}{}
	wg.Wait()
}

N个协程交替打印1到maxVal

go 复制代码
package main

import (
	"fmt"
)

func main() {

	cur := 0
	maxval := 10
	N := 3
	chs := make([]chan struct{}, 3)
	closeCh := make(chan struct{})

	for i := 0; i < N; i++ {
		chs[i] = make(chan struct{})
	}
	for i := 0; i < N; i++ {
		go func(i int) {
			for {
				_, ok := <-chs[i]
				if !ok {
					//fmt.Printf("go %d close\n", i)
					return
				}

				fmt.Printf("go %d print %d\n", i, cur)
				if cur == maxval {
					closeCh <- struct{}{}
					return
				}
				cur++
				chs[(i+1)%N] <- struct{}{}
			}
		}(i)
	}

	chs[0] <- struct{}{}
	<-closeCh
	for i := 0; i < N; i++ {
		close(chs[i])
	}
	fmt.Printf("main end\n")
}

使用三个协程分别打印A,B,C打印这个100次

go 复制代码
package main

import (
	"fmt"
)

func main() {

	cnt := 2
	N := 3
	chs := make([]chan struct{}, 3)
	closeCh := make(chan struct{})

	for i := 0; i < N; i++ {
		chs[i] = make(chan struct{}, 1)
	}
	for i := 0; i < N; i++ {
		go func(i int) {
			b := byte('A') + byte(i)
			for j := 0; j < cnt; j++ {
				<-chs[i]
				fmt.Printf("go %d print %c\n", i, b)
				chs[(i+1)%N] <- struct{}{}
			}
			if i == N-1 {
				closeCh <- struct{}{}
			}
		}(i)
	}

	chs[0] <- struct{}{}
	<-closeCh
	for i := 0; i < N; i++ {
		close(chs[i])
	}
	fmt.Printf("main end\n")
}
相关推荐
Victor35621 分钟前
MongoDB(57)如何优化MongoDB的查询性能?
后端
Victor35624 分钟前
MongoDB(58)如何使用索引优化查询?
后端
行百里er28 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·代码规范
娇娇yyyyyy31 分钟前
QT编程(17): Qt 实现自定义列表模型
开发语言·qt
码财小子32 分钟前
聊聊 C++ 模块“注册式”的优雅姿势
后端·代码规范
ms_27_data_develop1 小时前
Java枚举类、异常、常用类
java·开发语言
掘金码甲哥1 小时前
higress 这个中登才是AI时代的心头好
后端
add45a1 小时前
C++编译期数据结构
开发语言·c++·算法
IT_陈寒1 小时前
一文搞懂JavaScript的核心概念
前端·人工智能·后端
IT_陈寒1 小时前
Java开发者必看!5个提升开发效率的隐藏技巧,你用过几个?
前端·人工智能·后端