2010-10-17 2 views
9

Каналы объединяют коммуникацию - обмен значением - с синхронизацией - гарантируя, что два вычисления (goroutines) находятся в известном состоянии.Как мы можем использовать каналы в Go вместо mutex?

Как можно использовать каналы в Google Перейти для выполнения функций мьютекса?

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() 
} 
+3

Этот вопрос вроде не попадает в точку. Вы должны спросить себя: «Почему я хочу мьютекс, и как я могу использовать каналы вместо этого?» –

ответ

17

Пример использования канала в качестве 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() 
} 
+0

Спасибо за ответ MizardX. – Kevin

+0

Удивительное решение !! – HaltingState

+2

Хотя каналы обеспечивают хорошее решение для защищенных данных, это менее эффективное решение для одного писателя и многих читателей. –

4

Если у вас есть канал, который вы c инициализации с 1 пунктом в нем, то вы можете «проверить» на «семафор» путем удаления значения из канала (<-c). Вы можете «высвободить» его, добавив значение обратно (c <- 1).

Поскольку оператор извлечения из канала a) является атомарным и b) блокируется до тех пор, пока не будет извлечено что-то, оно работает как мьютекс, поскольку, если один поток выполнения уже проверил его, в нем ничего не будет канал, и, таким образом, он будет блокироваться до тех пор, пока поток, который он проверил, не возвращает значение каналу для другого потока для извлечения.

+0

Спасибо Amber. Можем ли мы иметь пример, показанный выше, реализованный с использованием каналов вместо мьютекса? – Kevin

Смежные вопросы