go算法题

一、多个协程交替依次按顺序打印0-40

1、channel控制多协程
package main

import (
	"fmt"
	"time"
)


func add(ch chan bool, num *int) {
	ch <- true
	*num = *num + 1
	fmt.Println("num 的值:", *num)
	<-ch
}

func main() {
	// 创建一个size为1的channel
	ch := make(chan bool, 1)

	var num int
	for i := 0; i <= 40; i++ {
		//go add(ch, &num)
		go func(ch chan bool, num *int) {
			ch <- true
			fmt.Println("num 的值:", *num)
			*num = *num + 1
			<-ch
		}(ch, &num)
	}

	time.Sleep(2)
}
2、 控制多协程
import (
	"fmt"
	"sync"
	"time"
)

func add(mux *sync.Mutex, num *int) {
	mux.Lock()
	fmt.Println("num 的值:", *num)
	*num = *num + 1	
	mux.Unlock()
}

func main1() {
	var mux sync.Mutex
	var num int
	for i := 0; i <= 40; i++ {
		//go add(&mux, &num)
		go func(mux *sync.Mutex, num *int) {
			mux.Lock()
			fmt.Println("num 的值:", *num)
			*num = *num + 1
			mux.Unlock()
		}(&mux, &num)
	}

	time.Sleep(2)
}

二、4个协程交替依次按顺序打印0-40

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	f0()
	f1()
}
func f0() {
	wg := sync.WaitGroup{}
	count := 0
	wg.Add(4)
	for i := 0; i < 4; i++ {
		go func(i int) {
			for {
				if count > 40 {
					wg.Done()
					return
				}
                //并发执行的所有go程只有一个满足条件并执行
				if count%4 == i {
					fmt.Println(count)
					count++
				}
			}
		}(i)
	}
	wg.Wait()
}

func f1() {
	ch1 := make(chan bool)
	ch2 := make(chan bool)
	ch3 := make(chan bool)
	ch4 := make(chan bool)
	
	go func() {
		for i := 0; i <= 40; i += 4 {
			<-ch1
			fmt.Println(i)
			ch2 <- true
		}
	}()
	
	go func() {
		for i := 1; i <= 40; i += 4 {
			<-ch2
			fmt.Println(i)
			ch3 <- true
		}
	}()
	
	go func() {
		for i := 2; i <= 40; i += 4 {
			<-ch3
			fmt.Println(i)
			ch4 <- true
		}
	}()
	go func() {
		for i := 3; i <= 40; i += 4 {
			<-ch4
			fmt.Println(i)
			ch1 <- true
		}
	}()
	
	ch1 <- true
	
	time.Sleep(time.Second * 1)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值