为什么使用多线程
- I/O并发
- 并行
- 方便(便于写定时任务)
编写线程的挑战
- 处理共享数据
- 死锁
- 线程协作
- channel:从一个线程向另一个线程发送数据
- sync.cond():不确定是否有线程在等你的时候,每隔一段时间对线程发出一个ticket唤醒信号
- sync.WaitGroup:启动已知数量的goroutines,然后使它们等待直到调用WaitGroup的Done()结束

每执行一次done.Done(),WaitGroup的计数器会减一。
问:如果goroutine非正常死亡,导致WaitGroup无法归零怎么办?答:

