Mutexの代わりにGoでチャネルを使用するにはどうすればよいですか?
質問
チャネルは、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)抽出するものがあるまでブロックするので、それはミューテックスとして機能します。なぜなら、実行のスレッドがすでにチェックアウトされている場合、チャネルには何もないので、したがって、チェックアウトしたスレッドが別のスレッドを抽出するためにチャネルに値を返すまでブロックされます。
所属していません StackOverflow