我正在编写一个音频应用程序,它有多个产生声音的线程和一个混合声音并将它们发送到声卡的线程。我尝试了几种以“正确”方式同步线程的方法,包括信号和线程安全队列,但它们都太慢了。所以现在我为每个生产者使用一个布尔值来指示它的队列是否已满。它似乎工作得很好(32 个线程的 5ms 延迟)但是这样做安全吗?
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;
}
}
消费者看起来像这样(Naudio 从单独的线程调用):
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;
}