Go 语言并发编程:同步机制与资源管理
在 Go 语言的并发编程中,我们常常需要处理多个 goroutine 的同步、单例模式的实现、资源回收、条件变量、同步映射、信号量以及原子操作等问题。下面将详细介绍这些方面的内容。
1. goroutine 同步
在等待 goroutine 完成时,我们可以使用空结构体的通道来实现:
ch := make(chan struct{}) for i := 0; i < n; i++ { go func() { // do something ch <- struct{}{} }() } for i := 0; i < n; i++ { <-ch }不过,更推荐使用sync.WaitGroup来实现同步。sync.WaitGroup有一个计数器,代表等待的元素数量。它提供了三个方法:
| 方法 | 描述 |
| ---- | ---- |
|Add| 使用给定值更改计数器的值,该值可以为负。如果计数器小于零,应用程序会 panic。 |
|Done| 等同于Add(-1),通常在 goroutine 完成工作时调用,将计数器减 1。 |
|Wait| 阻塞当前 goroutine,直到计数器达到零。 |