我应该使用频道还是sync.Mutex锁()?

时间:2016-08-20 17:59:42

标签: go mutex

在执行public void onClick(View view) { Intent i = new Intent(this, Main2Activity.class); startActivity(i); } 时,我发现在命令启动os.Process.Kill之前调用cmd.Start(),我找到了可靠的解决方案,一个使用{{3} }}:

go test -race

或使用channel

package main

import "os/exec"

func main() {
    cmd := exec.Command("sleep", "10")
    started := make(chan struct{}, 1)

    go func() {
        <-started
        cmd.Process.Kill()
    }()

    if err := cmd.Start(); err != nil {
        panic(err)
    }
    started <- struct{}{}

    cmd.Wait()
}

这两个选项都有效但想知道什么是最惯用或更好的方法,而主要目标只是为了防止杀死一个尚未开始的过程。

1 个答案:

答案 0 :(得分:0)

我建议你使用频道,但是让我指出你的代码。

我注意到你使用了缓冲通道,然后在调用消耗通道的goroutine之前首先在该通道上发送数据。在我看来,最好是:

1)使用无缓冲信道进行信令,特别是在这种情况下。

2)让goroutine负责启动进程并调用wait,同时向主要信号通知它已启动。

像这样:

package main

import "os/exec"

func main() {

    cmd := exec.Command("sleep", "10")
    started := make(chan struct{})

    go func(cmd *exec.Cmd, signal chan struct{}) {
        if err := cmd.Start(); err != nil {
            panic(err)
        }

        started <- struct{}{}
        cmd.Wait()
    }(cmd, started)

    <-started
    cmd.Process.Kill()
}