En tant que langage de programmation concurrent, le langage Go fournit de riches mécanismes de synchronisation pour aider les développeurs à résoudre les problèmes de concurrence. La maîtrise de ces mécanismes de synchronisation est cruciale pour améliorer vos compétences en programmation simultanée. Cet article illustrera certains mécanismes de synchronisation courants dans le langage Go à travers des exemples de code spécifiques pour aider les lecteurs à mieux comprendre et utiliser ces mécanismes.
Mutex est un mécanisme de synchronisation de base utilisé pour protéger les ressources partagées contre l'accès par plusieurs goroutines en même temps. Ce qui suit est un exemple simple de verrouillage mutex :
package main import ( "fmt" "sync" ) var ( counter int mutex sync.Mutex ) func incrementCounter() { mutex.Lock() defer mutex.Unlock() counter++ } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() incrementCounter() }() } wg.Wait() fmt.Println("Counter:", counter) }
Dans l'exemple ci-dessus, le sync.Mutex
est utilisé pour protéger la variable counter
des accès simultanés, garantissant qu'il y a un seul Goroutine à la fois peut exécuter la fonction incrementCounter()
. sync.Mutex
来保护counter
变量的并发访问,确保每次只有一个goroutine可以执行incrementCounter()
函数。
通道是Go语言中一种用于在goroutine之间进行通信的机制,它可以用来传递数据和控制并发。下面是一个简单的通道示例:
package main import "fmt" func sendData(ch chan<- int) { for i := 0; i < 5; i++ { ch <- i } close(ch) } func receiveData(ch <-chan int) { for v := range ch { fmt.Println("Received:", v) } } func main() { ch := make(chan int) go sendData(ch) receiveData(ch) }
在上面的示例中,通过通道ch
在两个goroutine之间传递数据。sendData()
函数向通道发送数据,receiveData()
函数从通道接收数据,通过range
来遍历通道中的数据。
条件变量是一种在goroutine之间等待或发信号的机制,常用于实现一些复杂的同步逻辑。下面是一个简单的条件变量示例:
package main import ( "fmt" "sync" ) var ( done bool cond *sync.Cond mutex sync.Mutex ) func worker1() { mutex.Lock() for !done { cond.Wait() } mutex.Unlock() fmt.Println("Worker 1: Done") } func worker2() { mutex.Lock() done = true cond.Signal() mutex.Unlock() fmt.Println("Worker 2: Signaled") } func main() { cond = sync.NewCond(&mutex) go worker1() go worker2() }
在上面的示例中,通过条件变量cond
和互斥锁mutex
来实现两个goroutine之间的同步。worker1()
函数等待done
变量为true
时才继续执行,worker2()
函数设置done
变量为true
并发送信号给worker1()
ch
. La fonction sendData()
envoie des données au canal, la fonction receiveData()
reçoit des données du canal et parcourt les données dans le canal à travers range code>. 🎜🎜3. Variable de condition (Cond) 🎜🎜La variable de condition est un mécanisme d'attente ou de signalisation entre les goroutines. Elle est souvent utilisée pour implémenter une logique de synchronisation complexe. Voici un exemple simple de variable de condition : 🎜rrreee🎜Dans l'exemple ci-dessus, la synchronisation entre deux goroutines est obtenue via la variable de condition <code>cond
et le verrou mutex mutex
. La fonction worker1()
attend que la variable done
soit true
avant de continuer l'exécution. La fonction worker2()
. définit La variable done
est true
et envoie un signal à worker1()
. 🎜🎜Grâce aux exemples ci-dessus, j'espère que les lecteurs pourront avoir une compréhension plus approfondie du mécanisme de synchronisation dans le langage Go et l'utiliser de manière flexible dans des projets réels pour améliorer leurs compétences en programmation simultanée. 🎜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!