Хорошо, чтобы вы поняли, я объясню проблему:
Я использую библиотеку под названием ClanLIB (не мой выбор), эта библиотека SEEMLY (я не уверен, даже читая sourcE) создает поток, который обрабатывает звук.
Этот поток, когда буфер пуст, пытается извлечь больше данных, обычно это вызывает переполнение, когда библиотека генерирования данных слишком медленная, чтобы выдать больше данных, прежде чем звуковая карта достигнет конца буфера.
Итак, я добавил свой собственный поток, который продолжает генерировать звук на фоне.
Это работало нормально, за исключением того, что мой собственный поток иногда перехватывал слишком много процессорного времени и замораживал все остальное. Чтобы исправить это, я добавил условное ожидание.
Условное ожидание происходит, когда буфер заполнен, и когда ClanLIB запрашивает дополнительные данные, сигнализируется ожидание, поэтому поток записи в буфер возобновляется (до тех пор, пока он снова не будет заполнен).
Моя проблема в том, что, поскольку я добавил это условное ожидание, звуковую нить ClanLIB и мою собственную музыкальную нить, SOMETIMES «убегают», воспроизводя музыку, пока остальная часть приложения зависает.
Какое странное состояние может вызвать это?
псевдокод:
//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()
}