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: |

How to create a business channel on Telegram? (Tutorial) More>> The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. A Hong Kong protester with a petrol bomb. File photo: Dylan Hollingsworth/HKFP. With the administration mulling over limiting access to doxxing groups, a prominent Telegram doxxing group apparently went on a "revenge spree."
from us


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