2016-09-16 2 views
4

У меня есть метод с приемником указателя, мне было интересно, можно ли использовать этот приемник указателя в пределах этого метода? или я должен передать этот приемник указателя в качестве параметра?Использование приемника указателя в goroutine

, например:

func (m *dummyStruct) doSomething { 
    /* do a bunch of stuff */ 
    go func() { 
     m.a = x 
     m.doSomethingElse() 
    }() 
    return y 
} 

Я знаю, что я не могу пойти не так, передавая м в качестве параметра к goroutine, но мне было интересно, если это крайне необходимо

+0

'dummyStruct' также должен быть потокобезопасным. – squiguy

ответ

4

При изменении состояния m, вам понадобится блокировка мьютекса и тщательные блокировки.

Кроме этого, это увеличит контекст, пересекающий границы ваших потоков в большинстве случаев.

Вот почему мы имеем Go идиомы:

Не общаться путем обмена памятью; вместо этого, обмениваться памятью, обмениваясь данными.

https://blog.golang.org/share-memory-by-communicating

0

Я видел ссылку @ eduncan911 публикуемую, но никогда не пытался применить его. Надеюсь, этот пример помогает:

package main 

import (
    "fmt" 
    "time" 
) 

type dummyStruct struct { 
    a int 
} 

func (m *dummyStruct) doSomethingElse() { 
    fmt.Println(m.a) 
} 

func doSomething(c chan int) { 
    for i := 0; i < 5; i++ { 
     go func() { 
      x := time.Now().Unix() 
      c <- int(x) 
     }() 
     time.Sleep(time.Second) 
    } 
} 

func main() { 
    outputs := make(chan int) 
    m := &dummyStruct{} 
    doSomething(outputs) 
    for { 
     //block until we can read from channel: 
     x := <-outputs 
     m.a = x 
     m.doSomethingElse() 
    } 
} 

//Output: 
go run main.go 
1474052448 
1474052449 
1474052450 
1474052451 
1474052452 
fatal error: all goroutines are asleep - deadlock! 
+0

на мобильном телефоне - не лучший способ написать код в stackoverflow. ;) – eduncan911

0

Я думаю, что указатель не правильный способ обмена данными по goroutines, так как это снизит производительность. Лучший вариант - каналы.

+0

Это правда - причина в том, что совместное использование изменяемых данных может легко привести к проблемам из-за условий гонки. –

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