狭隘的同步就是等待或强制 多个线程结束后,再运行后续代码
go语言常用的同步方式,有4种:
默认用第二种,等待所有程序结束
如果只是简单的手动停止多个线程,可以用第一种和第三种方法
如果需要复杂的同步方法,例如超时停止,可以用第四种
-
第一种 用全局变量 [条件触发] 多个线程结束
初始化全局变量A=false
每个线程方法 中添加对变量A的判断
如果变量A=true, return 结束线程 -
第二种 用 sync.WaitGroup [等待] 多个线程结束
wg.add(1) 用于线程中或线程外,表示线程启动
wg.Done() 用于线程中,表示线程结束
wg.Wait() 用于线程外, 等待所有线程全部结束 -
第三种 用通道(chan)方式 [通知] 多个线程结束
利用通道收到信号后,调用 return 退出 线程 -
第四种 用上下文(context 包 )方式 [强制] 多个线程结束
WithCancel() 可以手动控制多个线程结束
WithTimeout 这个表示是超时自动结束,是多少时间后自动取消Context 结束线程的意思
WithDeadline() 等同于WithTimeout+WithCancel 即可以定时结束多个线程,也可以手动控制多个线程结束
–WithValue 与线程结束无关,主要是在线程间传递 参数
具体代码网上有很多,例如可以参考
https://www.sdk.cn/details/vOVl36qOLmnN8E9WXJ