我正在寫一個音頻應用程序,它有多個線程產生聲音和一個線程混合聲音並將它們發送到聲卡。我已經嘗試了幾種線程同步方式,包括Signals和線程安全隊列,但它們都太慢了。所以現在我爲每個生產者使用一個bool來表明它的隊列是否已滿。它似乎工作得很好(32個線程的延遲爲5ms),但這樣做是否安全?使用bools來同步多個線程安全嗎?
class PlayThreadParameters
{
public Queue<Samples> queue;
public bool isOutputQueueFull;
}
製片方是這樣的:
public void PolyPlayThread(object o)
{
var playThreadParameters = (PlayThreadParameters)o;
while (isPlaying)
{
while (playThreadParameters.isOutputQueueFull)
{
if (!isPlaying)
return;
Thread.Sleep(1);
}
... //fill output queue
playThreadParameters.isOutputQueueFull = true;
}
}
消費者看起來像這樣(由n音訊一個單獨的線程調用):
public override int Read(byte[] array, int offset, int count)
{
for (int v = 0; v < playThreadParameters.Length; v++)
while (!playThreadParameters[v].isOutputQueueFull)
{
if (!isPlaying)
return 0;
Thread.Sleep(1);
}
... //mix the samples from the outputqueues
for (int v = 0; v < playThreadParameters.Length; v++)
playThreadParameters[v].isOutputQueueFull =false;
return count;
}
你是如何設置isPlaying變量的? – marcind 2010-11-15 01:03:51
@marcind當用戶按下停止按鈕時,isPlaying設置爲false – 2010-11-15 01:14:43