Go /
НемногоПроБезопасностьМассивовВ Golang любая запись в массив не является thread-safe. Есть вот это: https://stackoverflow.com/questions/22517614/golang-concurrent-array-access см. ответ с сомнениями - если байты упакованы в слово, то запись может записывать слово целиком, тогда пострадают соседние байты. Я сделал эксперимент: package main import ( "fmt" "sync" ) const ArraySize = 8 var glob [ArraySize]uint8 func WriteAndRead(index int, valueToWrite uint8, avatar []uint8) { glob[index] = valueToWrite got := avatar[index]; if got != valueToWrite { fmt.Printf("Wrote %d and got %d\n", valueToWrite, got) }} func WriteAndReadManyTimes(goroutineId int, avatar []uint8) { times := 100000001; start := goroutineId * times index := goroutineId % ArraySize; for count := start; count < start + times; count++ { valueToWrite := uint8(count % 256) WriteAndRead(index, valueToWrite, avatar) }} func main() { avatar := glob[:] var wg sync.WaitGroup for goroutineId := 0; goroutineId < ArraySize; goroutineId++ { gi := goroutineId wg.Add(1) f := func() { defer wg.Done() WriteAndReadManyTimes(gi,avatar) } go f() } wg.Wait() fmt.Println("Done!") } Всё работает. Считается, что массивы и срезы безопасны по чтению. https://groups.google.com/forum/#!topic/golang-nuts/3FVAs9dPR8k https://grokbase.com/t/gg/golang-nuts/142s7phe65/go-nuts-are-slices-thread-safe-for-reading |