去哪儿面试题 (Golang实现)多线程顺序输出1-75
FredricZhu ·package main
import (
"fmt"
"sync"
"time"
)
var waiter sync.WaitGroup
func print5(i int) {
j := i
for j < i+5 {
fmt.Println(j)
j++
}
waiter.Done()
}
func main() {
fmt.Println("Start print 75")
waiter = sync.WaitGroup{}
waiter.Add(15)
for i := 1; i < 75; i += 5 {
go print5(i)
time.Sleep(1 * time.Nanosecond)
}
waiter.Wait()
fmt.Println("End print 75")
}
程序输出如下,
image.png
这道题感觉就是傻逼题目,go 协程 刻意就是没有顺序的,在怎么控制,效率都没高多少,用加锁的形式输出,还不如主线程速度快,控制顺序 逃不了 要抢锁别无他法
#9
更多评论
```
var a struct {
Mu sync.RWMutex
Count int
}
var wg sync.WaitGroup
func main() {
wg = sync.WaitGroup{}
wg.Add(75)
for i:=1; i<=75; i++ {
go Add()
}
wg.Wait()
}
func Add() {
defer wg.Done()
a.Mu.Lock()
a.Count++
fmt.Println(a.Count)
a.Mu.Unlock()
}
```
#1
package main
import (
"fmt"
"sync"
"time"
)
var waiter sync.WaitGroup
func print5(i int) {
j := i
for j < i+5 {
fmt.Println(j)
j++
}
waiter.Done()
}
func main() {
fmt.Println("Start print 75")
waiter = sync.WaitGroup{}
waiter.Add(15)
for i := 1; i < 75; i += 5 {
go print5(i)
time.Sleep(1 * time.Nanosecond)
}
waiter.Wait()
fmt.Println("End print 75")
}
程序输出如下,
image.png