为什么我的goroutines会相互等待而不是在完成后完成?

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循环中.它似乎工作..但我想用这段代码计算不同机器上的持续时间(我知道,我必须改变随机的东西),所以睡眠会伪造结果.

Del*_*ace 9

实际上,没有关于你的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)

最好的祝福