20

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

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

2 に答える 2

29

Channel を Mutex として使用する例:

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{}{}(typestruct{}と空の content {}) です。例については、 Ivan black のコメントを参照してください。

于 2010-10-17T11:36:52.727 に答える
5

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

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

于 2010-10-17T05:19:55.497 に答える