2011-12-02 60 views
2

併發例程我有三個併發程序就是這樣,打印問題與圍棋

func Routine1() { 

Print (value a, value b, value c) 
Print (value a, value b, value c) 
Print (value a, value b, value c) 

} 

func Routine2() { 
Print (value e, value f, value g) 
Print (value e, value f, value g) 
Print (value e, value f, value g) 
} 
func Routine3() { 
Print (value x, value y, value z) 
Print (value x, value y, value z) 
Print (value x, value y, value z) 
} 

func main() { 
go Routine1(command12, response12, command13, response13) 
go Routine2(command12, response12, command23, response23) 
Routine3(command13, response13, command23, response23) 
} 

現在我面對的問題是,有時它會發生,作爲三個並行程序,有時打印結果語句沒有正確執行意味着不打印整個,有一些東西插入另一個打印。例如,例程1的打印(值a,值b,值c)給出類似於值a,值b,值g的輸出,其中值g由例程2插入。有人可以建議我,我該如何阻止它?我已經嘗試過sync-mutex程序。然而,可能是因爲我的代碼太長,可能是我不能以正確的方式鎖定解鎖,所以它給出了一個死鎖錯誤。任何人都可以建議我如何以簡單的方式或以較低風險的同步互斥過程來實現這些目標。

有關我的這個問題的更多信息可以找到here

回答

6

按照您所描述的那樣進行打印不是原子操作。不要使用互斥,請嘗試Go方式。將一個通道傳入每個接受字符串的goroutine。每當你想打印某些東西時,只需將該字符串發送到該通道即可。

一個單獨的goroutine無非是從該通道讀取並打印出來的任何內容。這樣就不需要鎖。

package main 

import (
    "fmt" 
    "sync" 
) 

func main() { 
    var wg sync.WaitGroup 
    wg.Add(2) // 2 routines we need to wait for. 

    stdout := make(chan string) 

    go routine1(&wg, stdout) 
    go routine2(&wg, stdout) 
    go printfunc(stdout) 

    wg.Wait() 

    close(stdout) 
} 

func routine1(wg *sync.WaitGroup, stdout chan<- string) { 
    defer wg.Done() 

    stdout <- "first print from 1" 
    // do stuff 
    stdout <- "second print from 1" 
} 

func routine2(wg *sync.WaitGroup, stdout chan<- string) { 
    defer wg.Done() 

    stdout <- "first print from 2" 
    // do stuff 
    stdout <- "second print from 2" 
} 

func printfunc(stdout <-chan string) { 
    for { 
     select { 
     case str := <- stdout: 
      fmt.Println(str) 
     } 
    } 
} 
+0

謝謝。這是非常好的程序。讓我嘗試。 – Arpssss