一尘不染

我们如何在Go中使用通道代替互斥体?

go

通道将通信(值的交换)与同步相结合,以确保两个计算(goroutines)处于已知状态。

如何使用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()
}

阅读 172

收藏
2020-07-02

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

您也可以使用chan struct{}而不是chan int减小内存大小。输入的值是struct{}{}(type
struct{}和一个空的content {})。有关示例,请参见Ivan
black的评论

2020-07-02