我们如何使用Go中的通道来代替互斥?

我们如何使用Go中的通道来代替互斥?,go,goroutine,Go,Goroutine,通道将值的交换与同步结合起来,保证两个计算(goroutine)处于已知状态 如何使用Google Go中的通道来执行互斥的功能 package main import "sync" var global int = 0 var m sync.Mutex func thread1(){ m.Lock() global = 1 m.Unlock() } func thread2(){ m.Lock() global = 2 m.Unlock(

通道将值的交换与同步结合起来,保证两个计算(goroutine)处于已知状态

如何使用Google Go中的通道来执行互斥的功能

package main

import "sync"

var global int = 0
var m sync.Mutex

func thread1(){
    m.Lock()
    global = 1
    m.Unlock()
}

func thread2(){
    m.Lock()
    global = 2
    m.Unlock()
}

func main(){
   go thread1()
   go thread2()
}

如果您有一个通道
c
,在其中使用1项进行初始化,那么您可以通过从通道中删除该值来“签出”该“互斥体”(
将通道用作互斥体的示例:

package main

var global int = 0
var c = make(chan int, 1)

func thread1(){
    <-c // Grab the ticket
    global = 1
    c <- 1 // Give it back
}

func thread2(){
    <-c
    global = 2
    c <- 1
}

func main() {
   c <- 1 // Put the initial value into the channel
   go thread1()
   go thread2()
}
主程序包
变量全局int=0
变量c=制造(成交量,1)
func thread1(){

谢谢Amber。我们可以使用通道而不是互斥来实现上面显示的示例吗?谢谢回答MizardX。虽然通道为受保护的数据提供了一个很好的解决方案,但对于一个写入程序和多个读取程序来说,它是一个效率较低的解决方案。我建议使用
chan struct{}
以避免实际数据发送。
chan struct{}
的工作原理类似于信号量,并且在内存中的大小与任何缓冲区大小都相同。例如,这个问题有点忽略了重点。你应该问自己“为什么我要一个互斥体,如何使用通道来代替?”