私は Go にかなり慣れていないのですが、私のコードには理解できないことが 1 つあります。簡単なバブルソート アルゴリズムを作成しました (あまり効率的ではないことはわかっています ;))。ここで、3 つの GoRoutine を開始します。各スレッドは、他のスレッドとは独立して配列をソートする必要があります。終了したら、fun. 「完了」メッセージを出力する必要があります。
ここに私のコードがあります:
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
}
これは私が得るものです:
Slices filled ...
Main working ...
Thread 1 done
Thread 2 done
Thread 3 done
彼のスライスが最小なので、スレッド 2 を最初に終了するべきではありませんか? スライスがどれほど大きくても、「完了」メッセージが同時に表示されるため、すべてのスレッドが他のスレッドの終了を待っているようです..
私のブレインバグはどこですか?=)
前もって感謝します。
*編集:バブルソート機能のforループに「time.Sleep(1)」を入れるとき。それはうまくいくようです..しかし、このコードを使用してさまざまなマシンで期間を計りたいので(ランダムなものを変更する必要があることはわかっています)、スリープすると結果が改ざんされます。