phi*_*ner 3 concurrency multithreading go bubble-sort goroutine
我是Go的新手,我的代码中有一件事我不明白.我写了一个简单的bubblesort算法(我知道它不是很有效;)).现在我想开始3个GoRoutines.每个线程应该独立于其他线程对其数组进行排序.完成后,功能.应打印"完成" - 消息.
这是我的代码:
package main
import (
"fmt"
"time" //for time functions e.g. Now()
"math/rand" //for pseudo random numbers
)
/* Simple bubblesort algorithm*/
func bubblesort(str string, a []int) []int {
for n:=len(a); n>1; n-- {
for i:=0; i<n-1; i++ {
if a[i] > a[i+1] {
a[i], a[i+1] = a[i+1], a[i] //swap
}
}
}
fmt.Println(str+" done") //done message
return a
}
/*fill slice with pseudo numbers*/
func random_fill(a []int) []int {
for i:=0; i<len(a); i++ {
a[i] = rand.Int()
}
return a
}
func main() {
rand.Seed( time.Now().UTC().UnixNano()) //set seed for rand.
a1 := make([]int, 34589) //create slice
a2 := make([]int, 42) //create slice
a3 := make([]int, 9999) //create slice
a1 = random_fill(a1) //fill slice
a2 = random_fill(a2) //fill slice
a3 = random_fill(a3) //fill slice
fmt.Println("Slices filled ...")
go bubblesort("Thread 1", a1) //1. Routine Start
go bubblesort("Thread 2", a2) //2. Routine Start
go bubblesort("Thread 3", a3) //3. Routine Start
fmt.Println("Main working ...")
time.Sleep(1*60*1e9) //Wait 1 minute for the "done" messages
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
Slices filled ...
Main working ...
Thread 1 done
Thread 2 done
Thread 3 done
Run Code Online (Sandbox Code Playgroud)
不应该首先完成线程2,因为他的切片是最小的?似乎所有线程都在等待其他人完成,因为"完成"消息同时出现,无论切片有多大..
我的脑力在哪里?=)
提前致谢.
*编辑:将"time.Sleep(1)"放入bubblesort函数的for循环中.它似乎工作..但我想用这段代码计算不同机器上的持续时间(我知道,我必须改变随机的东西),所以睡眠会伪造结果.
实际上,没有关于你的goroutines执行顺序的保证.
但是,如果通过明确地让2个处理器核运行来强制执行真正的并行处理:
import (
"fmt"
"time" //for time functions e.g. Now()
"math/rand" //for pseudo random numbers
"runtime"
)
...
func main() {
runtime.GOMAXPROCS(2)
rand.Seed( time.Now().UTC().UnixNano()) //set seed for rand.
...
Run Code Online (Sandbox Code Playgroud)
然后你会得到预期的结果:
Slices filled ...
Main working ...
Thread 2 done
Thread 3 done
Thread 1 done
Run Code Online (Sandbox Code Playgroud)
最好的祝福