Mutexの代わりにGoでチャネルを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3952061

  •  08-10-2019
  •  | 
  •  

質問

チャネルは、2つの計算(ゴルチン)が既知の状態にあることを保証することを同期する通信 - 値の交換 - を同期することを組み合わせます。

Googleのチャネルを使用してMutexの機能を実行するにはどのように可能ですか?

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()
}
役に立ちましたか?

解決

チャネルをミューテックスとして使用する例:

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{}{} (タイプ struct{} そして空のコンテンツ {})。見る Ivan Blackのコメント 例として。

他のヒント

チャンネルがある場合 c 1つのアイテムで初期化することは、チャネルから値を削除して「ミューテックス」を「チェックアウト」することができます(「ミューテックス」をチェックアウトできます。<-c)。値を戻すことで「リリース」できます(c <- 1).

抽出からチャネルからの抽出演算子a)はアトミックであり、b)抽出するものがあるまでブロックするので、それはミューテックスとして機能します。なぜなら、実行のスレッドがすでにチェックアウトされている場合、チャネルには何もないので、したがって、チェックアウトしたスレッドが別のスレッドを抽出するためにチャネルに値を返すまでブロックされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top