GO_INTERVIEW_LIB Telegram 599
Как избежать состояния гонки?

Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
gopackage main
import (
«fmt»
«sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock() // Блокируем доступ
counter++
mu.Unlock() // Освобождаем доступ
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Правильное значение}


Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
gopackage main
import «fmt»
func main() {
ch := make(chan int)
go func() {
sum := 0
for i := 0; i < 1000; i++ {
sum++
}
ch <- sum
}()
result := <-ch
fmt.Println(«Result:», result) // Гарантированно корректное значение}

Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)

var counter int64
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
atomic.AddInt64(&counter, 1) // Атомарное увеличение
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Корректное значение}

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

Используйте инструменты для обнаружения состояния гонки:
Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
go run -race main.go


Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.
👍11



tgoop.com/go_interview_lib/599
Create:
Last Update:

Как избежать состояния гонки?

Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:

gopackage main
import (
«fmt»
«sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock() // Блокируем доступ
counter++
mu.Unlock() // Освобождаем доступ
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Правильное значение}


Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
gopackage main
import «fmt»
func main() {
ch := make(chan int)
go func() {
sum := 0
for i := 0; i < 1000; i++ {
sum++
}
ch <- sum
}()
result := <-ch
fmt.Println(«Result:», result) // Гарантированно корректное значение}

Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)

var counter int64
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
atomic.AddInt64(&counter, 1) // Атомарное увеличение
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Корректное значение}

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

Используйте инструменты для обнаружения состояния гонки:
Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
go run -race main.go


Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.

BY Библиотека Go для собеса | вопросы с собеседований


Share with your friend now:
tgoop.com/go_interview_lib/599

View MORE
Open in Telegram


Telegram News

Date: |

With the administration mulling over limiting access to doxxing groups, a prominent Telegram doxxing group apparently went on a "revenge spree." “Hey degen, are you stressed? Just let it all out,” he wrote, along with a link to join the group. Polls Add up to 50 administrators The imprisonment came as Telegram said it was "surprised" by claims that privacy commissioner Ada Chung Lai-ling is seeking to block the messaging app due to doxxing content targeting police and politicians.
from us


Telegram Библиотека Go для собеса | вопросы с собеседований
FROM American