サーチ…


ミューテックスロック

Goのミューテックスロックは、一度に1つのゴルーチンだけがロックを持つことを保証します。

import "sync"

func mutexTest() {
    lock := sync.Mutex{}
    go func(m *sync.Mutex) {
        m.Lock()
        defer m.Unlock()   // Automatically unlock when this function returns
        // Do some things
    }(&lock)

    lock.Lock()
    // Do some other things
    lock.Unlock()
}

Mutex使用すると、競合状態、同時変更、および同じリソース上で動作する複数の並行ルーチンに関連するその他の問題を避けることができます。 Mutex.Unlock()は、ロックを取得したルーチンだけでなく、どのルーチンでも実行できることに注意してください。また、別のルーチンがロックを保持している場合、 Mutex.Lock()呼び出しは失敗しません。ロックが解除されるまでブロックされます。

ヒント:関数にMutex変数を渡すときは、常にそれをポインタとして渡します。それ以外の場合は、変数のコピーが作成されます。このコピーは、ミューテックスの目的を無効にします。古いGoバージョン(<1.7)を使用している場合、コンパイラはこの間違いについて警告しません!



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow