私はgolangでマルチスレッドを実装しようとしていました。私はgoルーチンを実装することができますが、期待どおりに動作していません。以下、私が用意したサンプルプログラム、goloutineまたはmultithreadingがgolangで動作しない
func test(s string, fo *os.File) {
var s1 [105]int
count :=0
for x :=1000; x<1101;x++ {
s1[count] = x;
count++
}
//fmt.Println(s1[0])
for i := range s1 {
runtime.Gosched()
sd := s + strconv.Itoa(i)
var fileMutex sync.Mutex
fileMutex.Lock()
fmt.Fprintf(fo,sd)
defer fileMutex.Unlock()
}
}
func main() {
fo,err :=os.Create("D:/Output.txt")
if err != nil {
panic(err)
}
for i := 0; i < 4; i++ {
go test("bye",fo)
}
}
OUTPUTある - good0bye0bye0bye0bye0good1bye1bye1bye1bye1good2bye2bye2bye2bye2 ....など 上記のプログラムは、ファイルに「BYE」ファイルを作成して書き込み、「こんにちは」となります。
私の問題は5スレッドを作成しようとしていて、別のスレッドで異なる値の値を処理したかったのです。上記の例が表示される場合は、「bye」を4回印刷しています。
iは、など....任意のアイデアどのように私はこれを達成することができます.... 5スレッド、
good0bye0good1bye1good2bye2を使用して、以下のような出力をしたいですか?
あなたの主な機能を妨げるものは何もありません。すべての出力が表示される前に、プログラムが終了します。 – JimB
@JimBご返信ありがとうございます。ファイルに書き込んで作業しています。 – user2768132
メインでブロッキングがないこと(最初に修正する必要があります)のほかに、mutexはgoroutine間で共有されないため、何もロックしていませんし、ループごとに初期化された別個のmutexもあります。 。あなたは戻っていないときにロックを解除するためにdeferを呼び出します。よく動作するプログラムで 'runtime.GoSched'を呼び出す必要はありません。 – JimB