1.首先我们复习下造成死锁的几个充要条件:
1)互斥:互斥资源,只能被一个进程使用
2)不剥夺:非抢占式调度,不能强行抢用其他进程资源
3)请求和保持:占有着资源不释放,同时申请其他资源
4)环路等待:没什么可说的
在WaveOutReset时回调函数内调用waveout函数,极易发生死锁。
首先假设我们播放缓冲区有三个语音包,
线程1: waveOutReset();
waveOutClose();
回调函数:waveOutCallBack(){
这里调用waveOut函数处理语音包。
}
我们先了解下waveOutReset的用法,waveOutReset作用是将播放缓冲区的语音包都交给回调函数处理后,返回,waveOutRest执行结束,然后才能执行后面的waveOutClose(); 所以死锁原因如下:
1.waveOutReset占用互斥资源语音包,系统为非抢占式调度,将第一个head语音包发送给回调函数时,我们在回调函数里调用了waveOut函数处理head语音包,然后语音包资源被waveOutReset线程占用,获取不到,而获取不到资源,在回调函数里就没法继续向下执行,卡在这,同时waveOutReset只将一个语音包传到回调,另外两个还没有传呢,就卡在回调函数里,waveOutReset必须三个都处理完才能返回,也卡在这里不能向下执行,所以,环路等待。
这是我对WaveOutReset死锁的理解。不喜勿喷。。