Que tal buen día ,
Tengo una duda con respecto al threading y a los semáforos , les explico un poco de mi código..
Mi semáforo lo he declarado así :
Semaphore sem = new Semaphore(0,1);// para que solo un hilo pueda ocuparlo
Tengo dos clases que cada una tiene un metodo principal y estan basadas en el modelo Productor - Consumidor
Producer.Run()
Consumer.Run()
los cuales ejecuto desde el ThreadPool para que se encuentren en diferente hilo:
ThreadPool.QueueUserWorkItem(new WaitCallback(producer.RunProductorAsync), autoEvent);
ThreadPool.QueueUserWorkItem(new WaitCallback(consumer.Run), autoEvent);
Cabe destacar que ambas clases Reciben el MISMO semaforo por referencia.
de manera que en el codigo del metodo Run del productor tengo lo siguiente
public void RunProductorAsync(Object StateInfo)
{
CGauss NumGauss = new CGauss(); //Esta clase contiene metodos que genera un numero de Distribucion Gaussiana aleatorio
for (int i = 0; i < _M; i++) //se genera ese numero M veces
{
Semaforo.WaitOne();//AQUI UN PROBLEMA ----Se supone que si nadie lo esta ocupando como es el caso ... deberia continuar con su trabajo sin problema
// pero SE DETIENE y no llega a ningun lado
DQueue.Enqueue(NumGauss.GetNormal(_Mu, _Sigma));//Generando el Dato Gaussiano
Semaforo.Release();//Se libera el semaforo para que el consumidor pueda hacer su trabajo
((AutoResetEvent)StateInfo).Set();
}
DQueue.Enqueue(true);//Se notifica que ya ha terminado el proceso
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Y de hecho ya no se ejecuta el Consumidor ...
según lo que he consultado en las paginas de MSDN de MicroSoft y de diversos programadores , debería de estar trabajando correctamente , pero no es asi , inclusive ya conseguí el libro Fco.Javier Ceballos
y tampoco encuentro donde puedo estar equivocado .
De ante mano les agradezco mucho la ayuda , me trae vuelto loco este problema