Pregunta

Estoy escribiendo una aplicación de audio que tiene múltiples hilos de producción de sonido y un hilo que mezcla los sonidos y los envía a la tarjeta de sonido. He intentado varias formas de hilos de sincronización de la manera 'correcta', incluidas las señales e hilo colas de seguros, pero todos estaban demasiado lento. Así que ahora utilizo un bool para cada productor para indicar si la cola está llena. Parece que funciona muy bien (5 ms de latencia de 32 hilos), pero ¿es seguro hacerlo de esta manera?

class PlayThreadParameters
{
    public Queue<Samples> queue;
    public bool isOutputQueueFull;
}

Los productores se ven así:

  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;
    }
}

Las miradas de consumo como este (llamados a partir de un hilo separado por 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;
        }
¿Fue útil?

Solución

No, no es completamente seguro, pero puede que tenga suerte la mayoría de las veces ;-) Usted debe estar utilizando la métodos entrelazadas para acceder a los bool.

Otros consejos

Por lo que yo sé, el modelo de memoria de .NET no garantiza que los cambios de una variable hecha en un único hilo será visible en otro hilo. Es necesario una memoria barrera allí. El (aunque no la más eficiente) forma más sencilla de organizar que es mediante el uso de métodos lock o Interlocked.

Por cierto, espera ocupada no es el mejor método para lograr su objetivo. Tal vez le gustaría cambiar a la modelo productor-consumidor con la condición variable apropiada (Monitors en el lenguaje C # ) uso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top