go - 我应该使用 channel 还是 sync.Mutex lock()?

标签 go mutex

在执行 go test -race 时,我发现对 os.Process.Kill 的调用, 是在命令开始之前创建的 cmd.Start() ,我提出了可能的解决方案,一个是使用 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()
}

或使用 lock :

package main

import (
    "os/exec"
    "sync"
)

func main() {
    var lock sync.Mutex
    cmd := exec.Command("sleep", "10")

    lock.Lock()
    if err := cmd.Start(); err != nil {
        panic(err)
    }
    lock.Unlock()
    go func() {
        cmd.Process.Kill()
    }()

    cmd.Wait()
}

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

最佳答案

我建议您使用一个 channel ,但让我指出一些关于您的代码的事情。

我注意到您使用了一个缓冲 channel ,然后先在该 channel 上发送数据,然后再调用使用该 channel 的 goroutine。在我看来,最好是:

1) 使用无缓冲 channel 进行信号传输,尤其是在这种情况下。

2) 让 goroutine 负责启动进程并调用 wait,同时向 main 发出它已启动的信号。

像这样:

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()
}

关于go - 我应该使用 channel 还是 sync.Mutex lock()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39057184/

相关文章:

go - Go 中嵌入类型的 String() 方法的奇怪行为

go - Go SDK使用的Gcloud身份验证帐户

unicode - unicode.RangeTable 如何工作?

c++ - 复制构造函数相关的编译错误

go - Sarama Kafka ConsumerGroup函数返回

c++ - 如果在共享内存中,pthread 互斥锁是否可以跨线程工作?

c++ - 信号量和互斥锁

c - 如何修复我的 pthread 代码遇到的此错误?

multithreading - 如何使用 boost::thread mutex 来同步写访问?

go - 将包范围内的多个文件共享的常量放在哪里?