Потоки новичка с проблемой с убегающими темами - PullRequest
3 голосов
/ 12 августа 2010

Хорошо, чтобы вы поняли, я объясню проблему: Я использую библиотеку под названием 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()
}

Ответы [ 4 ]

1 голос
/ 21 сентября 2010

Я тоже использую clanlib для проекта, но использую OpenAL для звука.Кажется, он работает точно так же, как при подаче в буфер и т. Д.

Я также использую отдельный поток для звука, но я решил просто добавить фиксированный период ожидания после каждой попытки подачи в буфер.Это просто и кажется довольно солидным.И блокировка не требуется;)

1 голос
/ 14 августа 2010

Вы слишком много делаете в зонах мьютекса - скорее всего, вы блокируете сигнал cond1. Вы должны делать как можно меньше внутри блокирующих областей, потому что чем больше вы делаете, тем больше риск, что вы создадите тупик - и вам абсолютно никогда не следует ждать сигнала внутри мьютекса, который охраняет отправку сигнала - если вы ' ожидание, оно никогда не будет отправлено - condition_wait не разблокирует ваш объект мьютекса, как он мог узнать об этом?

«Решение с помощью добавления условных ожиданий» является сильным показателем того, что у вас есть состояние гонки, приводящее к тупику - вы не решили проблему, как только, по какой-либо причине, изменилось время выполнения вашей логики, скажем поскольку запущено другое приложение, тупик может вернуться.

0 голосов
/ 30 августа 2010

Я на самом деле, не знаю, в чем проблема, это было решено случайно ...

У меня была связанная проблема, эта была вызвана состоянием гонки при удалении потока ... Я переместил некоторый код (мне даже не нужно было ничего перекодировать), и он тоже исчез. Теперь вещь совершенно стабильна! (ну, еще есть недоработки, но теперь они более редки)

0 голосов
/ 12 августа 2010

Если вы используете ClanLib game SDK, это хорошо зарекомендовавший себя, протестированный и поддерживаемый SDK.Без обид, но, поскольку вы - признанный новичок, проблема, скорее всего, в вашем коде, чем в их.если это так, я сомневаюсь, что лучшим решением будет added my own thread, that keeps generating sound on the background.Я говорю это потому, что подозреваю, что вы используете неправильный подход и что, если вы сможете найти решение с помощью ClanLib, вам не понадобится ваша тема, и ваша проблема исчезнет без необходимости ее решения.Хорошо, что вы разместили код, спасибо.Я сейчас уйду и посмотрю на это.

И, наконец, такой же большой поклонник, как и я, не лучше ли сначала спросить на официальном форуме ClanLib first?


Редактировать: почему вы так уверены, что это опустошение?мне все еще трудно в это поверить, но если вы не можете обнаружить это в своей программе, то почему бы не sleep(), а не генерировать звук?(как долго спать? Как вы знаете, сколько звука генерировать? Разве этот генерируемый звук не мешает "реальному" звуку?)

...