Как использовать пакет sync для управления конкурентным доступом к данным?

Пользователь

от ciara , в категории: Golang , год назад

Как использовать пакет sync для управления конкурентным доступом к данным?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от lilla.herman , год назад

@ciara 

Пакет sync в Go предоставляет набор средств для управления конкурентным доступом к данным. Он включает в себя механизмы синхронизации, такие как мьютексы, условные переменные и ограничители.


Вот пример использования мьютексов для обеспечения безопасности доступа к общему ресурсу:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
	"fmt"
	"sync"
)

type SafeCounter struct {
	v   map[string]int
	mux sync.Mutex
}

func (c *SafeCounter) Inc(key string) {
	c.mux.Lock()
	defer c.mux.Unlock()
	c.v[key]++
}

func (c *SafeCounter) Value(key string) int {
	c.mux.Lock()
	defer c.mux.Unlock()
	return c.v[key]
}

func main() {
	c := SafeCounter{v: make(map[string]int)}
	for i := 0; i < 1000; i++ {
		go c.Inc("somekey")
	}

	fmt.Println(c.Value("somekey"))
}


Здесь мы создаем тип SafeCounter, который содержит карту со строковыми ключами и целочисленными значениями. Методы Inc и Value обеспечивают безопасный доступ к карте, блокируя мьютекс при записи или чтении.


В главной функции мы создаем экземпляр SafeCounter и запускаем 1000 горутин, каждая из которых вызывает метод Inc для ключа "somekey". Затем мы выводим значение этого ключа, чтобы убедиться, что все операции записи были корректно синхронизированы.


Кроме мьютексов, пакет sync также содержит другие средства для управления конкурентным доступом к данным, такие как RWMutex для чтения-записи блокировки и WaitGroup для координации завершения горутин. Какой именно механизм использовать, зависит от требований к конкурентному доступу к данным в вашей программе.