2011-12-02 59 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