go使用两个协程交替打印1-100

1. 使用channel控制

func main() {
	wg := sync.WaitGroup{}
	c1 := make(chan struct{}, 1)
	c2 := make(chan struct{}, 0)

	wg.Add(2)
	c1 <- struct{}{}
	go func() {
		for i := 1; i <= 100; i += 2 {
			<-c1
			fmt.Println("goroutine1: ", i)
			c2 <- struct{}{}
		}
		wg.Done()
	}()
	go func() {
		for i := 2; i <= 100; i += 2 {
			<-c2
			fmt.Println("goroutine2: ", i)
			c1 <- struct{}{}
		}
		wg.Done()
	}()
	wg.Wait()
}

2. 使用互斥锁加条件变量控制

func main() {
	mutex := sync.Mutex{}
	cond := sync.NewCond(&mutex)
	flag := true
	wg := sync.WaitGroup{}
	wg.Add(2)
	go func() {
		defer wg.Done()
		for i := 1; i <= 100; i += 2 {
			mutex.Lock()
			if flag != true {
				cond.Wait()
			}
			fmt.Println("goroutine1: ", i)
			flag = false
			cond.Signal()
			mutex.Unlock()
		}
	}()
	go func() {
		defer wg.Done()
		for i := 2; i <= 100; i += 2 {
			mutex.Lock()
			if flag != false {
				cond.Wait()
			}
			fmt.Println("goroutine2: ", i)
			flag = true
			cond.Signal()
			mutex.Unlock()
		}
	}()
	wg.Wait()
}
posted @ 2025-03-31 15:20  seonwee  阅读(98)  评论(0)    收藏  举报