好的,据您所知,我将解释这个问题:我正在使用一个名为 ClanLIB 的库(不是我的选择),该库 SEEMLY(我不确定,甚至阅读源代码)创建了一个处理声音的线程。
该线程在缓冲区为空时尝试获取更多数据,通常这会导致数据生成库太慢而无法在声卡到达缓冲区结束之前提供更多数据时导致欠载。
所以我添加了我自己的线程,它不断在背景上产生声音。
这工作得很好,除了我自己的线程有时会劫持过多的 CPU 时间并冻结其他所有内容。为了解决这个问题,我添加了条件等待。
当缓冲区已满时发生条件等待,当 ClanLIB 请求更多数据时,会发出等待信号,因此缓冲区写入线程会恢复(直到再次满)。
我的问题是,由于我添加了这个条件等待、ClanLIB 声音线程和我自己的音乐线程,有时会“失控”,在应用程序的其余部分冻结时播放音乐。
什么样的奇怪情况会导致这种情况?
伪代码:
//main thread (that get frozen)
start_sound_thread();
do_lots_of_stuff();
quit();
//Sound Thread:
While(true)
{
play(buffer);
if(buffer_empty)
{
mutex.lock()
buffer = buffer2;
if(buffer2_full)
{
signal(cond1);
buffer2_full = false;
}
mutex.unlock()
}
}
//Music Library Thread:
while(true)
{
mutex.lock()
if( check_free_space(buffer2) == 0)
{
buffer2_full = true;
condition_wait(cond1);
}
write_music(buffer2);
mutex.unlock()
}