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()
}
本文来自博客园,作者:seonwee,转载请注明原文链接:https://www.cnblogs.com/seonwee/p/18802183

浙公网安备 33010602011771号