【发布时间】:2016-09-09 18:28:59
【问题描述】:
我试图在 golang 中实现多线程。我能够实现 go 例程,但它没有按预期工作。下面是我准备的示例程序,
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)
}
}
输出-good0bye0bye0bye0bye0good1bye1bye1bye1bye1good2bye2bye2bye2bye2....等。 上面的程序会创建一个文件,并在文件中写入“Hello”和“bye”。
我的问题是我正在尝试创建 5 个线程并想用不同的线程处理不同的值。如果你会看到上面的例子,它打印了 4 次“bye”。
我希望使用 5 个线程进行如下输出,
good0bye0good1bye1good2bye2....等等....
知道如何实现吗?
【问题讨论】:
-
您的主要功能没有任何障碍。你的程序在你看到所有输出之前就退出了。
-
@JimB 感谢您的回复。但它正在写入文件并正常工作。
-
除了 main 中没有阻塞(你需要先修复)之外,互斥锁没有锁定 任何东西,因为它们不在 goroutines 之间共享,另外还有一个为每个循环初始化了单独的互斥锁,因此它甚至不会在 goroutine 中阻塞。当您不返回时,您调用 defer 来解锁锁。在行为良好的程序中,您永远不需要调用
runtime.GoSched。 -
@JimB 再次感谢您的宝贵意见。明白你的意思。但是您能否更正我的程序,以便我可以创建 5 个线程,每个线程将打印不同的值。这对我会有很大帮助。我是从我身边做的,但无法理解。请帮帮我。
标签: multithreading go concurrency goroutine