版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
概述
如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题.
sync六个基本的函数Once WaitGroup cond mutex rwmutex pool
总述
waitgroup
给协程标注 让程序不因为协程出现panic 一个sync总体的控制函数
once
用once可以保证上面的onc.Do()被执行一次 执行一次之后其他的协程就不会执行了
cond
cond其实就是哪个控制协程执行的包函数:让哪个执行,让全部执行,给函数标注,让函数等待执行、 加锁等
Signal是执行一个协程的信号
Broadcast是执行全部协程的信号
wait 协程等待通知,阻塞在此
NewCond创建条件
cond.L.Lock() 给协程加锁
cond.L.Unlock() //释放锁
pool
pool就是一个类似中间件的 存放东西的
put放入
get取出
New为走默认值
RWMUX
RWMUX是控制多个协程对于资源的使用顺序的
RLOCK RULOCK
LOCK ULOCK
在一个协程里面
对资源的
读锁的时候别的协程也可以读,但是不可以写
写锁的时候别的协程不可以操作,不可以读也不可以写
Mutex
多个协程会操作一个特定资源,就会出现意想不到的错误,所以我们使用互斥锁,
一个协程使用特定资源的时候进行锁定,用完解锁,
再让其他协程使用,所以其他协程想使用此资源,必须自己给资源解锁或等待正在使用的协程解锁
在代码中就是锁定一段代码,代码里面有资源
函数
type Cond
func NewCond(l Locker) *Cond
func (c *Cond) Broadcast()
func (c *Cond) Signal()
func (c *Cond) Wait()
type Locker
type Mutex
func (m *Mutex) Lock()
func (m *Mutex) Unlock()
type Once
func (o *Once) Do(f func())
type Pool
func (p *Pool) Get() interface{}
func (p *Pool) Put(x interface{})
type RWMutex
func (rw *RWMutex) Lock()
func (rw *RWMutex) RLock()
func (rw *RWMutex) RLocker() Locker
func (rw *RWMutex) RUnlock()
func (rw *RWMutex) Unlock()
type WaitGroup
func (wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()