** goroutine中的阻塞方式:**
01. 读取键盘
—键盘输入,解除阻塞
02. waitGroup
—底层的cont=0,
add(),add(-1) done() wait()完成解除阻塞
03. chan的读写
读写–写读
** 04. cond wait()**
条件变量的阻塞—通过通知解除阻塞
Single() 发送通知 ,发送一个 wait()完成解除阻塞
Broadcast() 广播,发送给所有人 wait()完成解除阻塞
1、条件变量概念:
条件变量的作用并不是保证在同一时刻仅有一个协程(线程)访问某个共享的数据资源,而是在对应的共享数据的状态发生变化时,通知阻塞在某个条件上的协程(线程)。条件变量不是锁,在并发中不能达到同步的目的,因此条件变量总是与锁一块使用。
** 2、条件变量使用:sync.Cond**
L:Loker 接口
Cond条件变量,总是要和锁结合使用
01. 作用*
—-条件
多个goroutine等待或接收通知的集合地
02. 3个指针方法
Wait() 等待goroutine接收通知, 通过Single(),Broadcast(),解除阻塞。
阻塞等待条件变量满足
释放已掌握的互斥锁相当于** cond.L.Unlock(). ** 注意:两步为一个原子操作。
当被唤醒,Wait()函数返回时,解除阻塞并重新获取互斥锁。相当于**cond.L.Lock() **
wait尝试解锁,等待————————-当前的goroutine进入了阻塞状态,等待被唤醒…single()或Broadcast()
一旦被唤醒后,又会被锁定
**
先阻塞着,等待被唤醒。唤醒方式有两个:单发通知和广播通知。
Single() 单发通知,给一个正等待(阻塞)在该条件变量上的goroutine(线程)发送通知。
**
**
- **Broadcast() ** 广播通知,给正在等待(阻塞)在该条件变量上的所有goroutine(线程)发送通知。
**
3、条件变量使用步骤:
** 判断条件变量**
- ** 加锁**
- ** 访问公共区 **
- ** 解锁**
- ** 唤醒阻塞在条件变量上的对端 **
1 | package main |
结果:
1 | main....已经上锁... |
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/goLangNote/goLangBasic/17_GoLang语言入门_基础语法_并发与多线程06_条件变量/
- 版权声明: 梁俊可工作室