1。无限等待signal
有线程1和线程2,线程1结束前需要等待线程2发送signal,才能结束。
结果线程1还未进入等待signal的时候,线程2已经发送signal完毕,造成线程1无限等待signal,程序陷入死循环。
2。相互等待signal
线程1发送消息(往消息队列写入), 线程2接收消息(从消息队列读取),线程3处理消息命令,线程4负责播放状态切换。
线程2如果收到消息,发送给线程3,只有线程3处理完毕才能处理下一个消息。
线程1的消息有两个来源:键盘输入和应用程序自动发送的。
有一条通道是这样的,线程4通知应用程序状态,这时候应用程序会自动发送消息,同时线程4进入等待signal状态。
线程1处理应用程序自动发送的消息,但同时键盘快速输入很多消息,线程1的消息队列充满, 需要等待队列清空的mutex,而这时线程4也要等待app给它发送signal,但app也在等待线程4能处理事件,可以得到空队列的mutex。结果相互等待,程序进入死循环。
3.处理野指针
线程1负责释放指针,线程2在指针释放之前,将这个指针赋值给一个局部变量。
线程1释放指针后,线程2继续使用这个局部变量,而且使用之前没有将释放的指针重新赋值给局部变量,导致程序crash。
改进: 线程1和线程2需要对指针进行保护和同步。