一、并发编程模板
func main() {
......
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// to do
}()
wg.Add(1)
go func() {
defer wg.Done()
// todo
}()
wg.Wait()
}
二、锁住共享资源
1. 原子函数
var counter int64 //多个goroutine都会增加其值的变量
//如果在goroutine中要对counter执行加法,那么要用原子操作
atomic.AddInt64(&counter, 1) //对counter加1
另外两个有用的原子函数是 LoadInt64 和 StoreInt64.
2. 互斥锁
互斥锁用于在代码上创建一个临界区,保证同一时间只有一个 goroutine 可以执行这个临界区代码。
var (
mutex sync.Mutex //定义一把互斥锁
counter int //多个goroutine要操作的变量
)
mutex.Lock()
{
counter = 10
}
mutex.Unlock()
三、通道channel
当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。
1. 创建通道