わかりました、問題を説明します。私は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()
}