2013-11-09 2 views
3

Я только что заметил и подтвердил, что замыкание Go замыкает внешние переменные по ссылке. Если переменная захватывается в Goroutine, и если Goroutine мультиплексируется в другую нить,Завершить захваченные переменные и общие данные?

  • безопасно ли изменять значение в закрытии?
  • Если это не безопасно, почему бы не предотвратить это?
  • Или он использует механизм безопасности? (например, замок)

ответ

7

Go выполняет захват внешних переменных по ссылке в закрытии, как вы заметили.

Можно ли изменить значение в закрытии?

Это переменная, как и любая другая, поэтому применяются те же правила, что и в нормальном коде Go. Безопасно его модифицировать, но если вы одновременно изменяете его, вам необходимо предоставить свою собственную блокировку или использовать атомный тип.

Для получения более подробной информации см. The Go Memory model.

Если это небезопасно, почему бы не избежать этого?

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

Go has an excellent race detector хотя может найти проблемы с одновременным доступом с переменным доступом.

Или он использует некоторые механизмы безопасности? (Например, замок)

No. Go никогда не запирает материал для вас - вам нужно использовать примитивы, предоставляемые в sync package или следовать философии Go из Do not communicate by sharing memory; instead, share memory by communicating, то есть использование каналов говорить между гоу рутин.

+1

Я не знаю, почему ... но считалось, что Go использует архитектуру share-nothing. И я это неправильно понял. – Eonil

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