La sécurité de concurrence des fonctions Go signifie que la fonction peut toujours fonctionner correctement lorsqu'elle est appelée simultanément, évitant ainsi les dommages causés par plusieurs goroutines accédant aux données en même temps. Les fonctions sécurisées pour la concurrence peuvent utiliser des méthodes telles que des verrous, des canaux ou des variables atomiques. Les verrous permettent aux goroutines d'avoir un accès exclusif aux sections critiques, les canaux fournissent un mécanisme de communication sécurisé et les variables atomiques fournissent un accès sécurisé simultané à des variables spécifiques. Dans les cas réels, les canaux sont utilisés pour implémenter des fonctions de sécurité de concurrence afin de garantir que plusieurs goroutines accèdent aux ressources partagées dans le bon ordre.
Dans Go, la sécurité de la concurrence consiste à garantir que les fonctions peuvent toujours fonctionner correctement lorsqu'elles sont appelées simultanément. En d’autres termes, la fonction doit s’assurer que son état interne n’est pas corrompu par un accès simultané de plusieurs goroutines.
Ce qui suit est un exemple de fonction non sécurisée pour la concurrence :
var counter int func IncrementCounter() { counter++ }
Même si counter
est déclaré comme un entier atomique
, le la fonction est toujours dangereuse, car il n'existe aucun mécanisme de synchronisation pour protéger l'accès au compteur
. Cela signifie que plusieurs goroutines peuvent essayer d'incrémenter counter
en même temps, provoquant une course aux données. counter
声明为 atomic
整数,该函数仍然不安全,因为没有同步机制来保护对 counter
的访问。这意味着多个 goroutine 可能同时尝试增加 counter
,导致数据竞争。
要创建并发安全的函数,可以使用几种不同的方法。
1. 使用锁
锁是一种同步机制,它允许 goroutine 在进入临界区(访问共享资源的代码段)之前获取锁。一旦 goroutine 获取锁,它可以独占地访问临界区。例如:
var mu sync.Mutex func IncrementCounter() { mu.Lock() defer mu.Unlock() counter++ }
2. 使用通道
通道是一种用于在 goroutine 之间安全通信的机制。可以使用通道传递消息或同步 goroutine 的执行。例如:
var incrementChan = make(chan struct{}) func IncrementCounter() { incrementChan <- struct{}{} <-incrementChan counter++ }
3. 使用原子变量
原子变量是一种特殊类型的变量,提供对变量的并发安全访问。Go 语言提供了几种内置的原子变量,例如:
import "sync/atomic" var counter int64 func IncrementCounter() { atomic.AddInt64(&counter, 1) }
以下是一个使用通道实现并发安全函数的实战案例:
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { ch := make(chan struct{}) for i := 0; i < 100; i++ { wg.Add(1) go func() { defer wg.Done() <-ch fmt.Println("Goroutine:", i) }() } close(ch) wg.Wait() }
此程序创建了 100 个 goroutine,每个 goroutine 都从通道 ch
ch
. Lorsqu'un canal est fermé, toutes les goroutines sont réveillées et leurs identifiants sont imprimés dans le bon ordre. 🎜🎜En utilisant des canaux, nous pouvons garantir que les goroutines n'accèdent pas aux ressources partagées (c'est-à-dire les canaux) en même temps, assurant ainsi la sécurité de la concurrence. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!