На моей машине runtime.NUMCPU
равно 4
Ниже код:
package main
import (
"fmt"
"sync"
"github.com/myhub/a/expressions"
)
var list = make([]int, 1e5)
func main() {
value := 0
for i := 0; i < 1e5; i++ {
list[i] = value // sample list
value = value + 1
}
var wg sync.WaitGroup
wg.Add(1)
var max1 int
go func() {
max1 = expressions.Max(list[0 : 1e5/4-1])
}()
wg.Add(1)
var max2 int
go func() {
max2 = expressions.Max(list[1e5/4 : 1e5/2-1])
}()
wg.Add(1)
var max3 int
go func() {
max3 = expressions.Max(list[1e5/2 : 3*1e5/4-1])
}()
wg.Add(1)
var max4 int
go func() {
max4 = expressions.Max(list[3*1e5/4 : 1e5-1])
}()
wg.Wait()
fmt.Println(max1, max2, max3, max4)
}
package expressions
func Max(list []int) int {
length := len(list)
if length > 1 {
if list[0] > list[length-1] {
return Max(list[:length-1])
} else {
return Max(list[1:length])
}
}
return list[0]
}
выдает ошибку:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc00001a0a8)
/usr/local/go/src/runtime/sema.go:56 +0x42
sync.(*WaitGroup).Wait(0xc00001a0a0)
/usr/local/go/src/sync/waitgroup.go:130 +0x64
main.main()
/home/machine1/code/src/github.com/myhub/a/Main.go:41 +0x1b5
exit status 2
Для списка длины make([]int, 1e5)
с несортированными данными,
Как разделить нагрузку list
на четыре потока ОС? найти максимальный элемент