Programação concorrente
using System; using System.Threading; using System.Collections; using System.Collections.Generic;
public class cls_produto{ public cls_produto(){
_novoItemEvento = new AutoResetEvent(false);
_fimThread = new ManualResetEvent(false);
_eventoArray = new WaitHandle[2];
_eventoArray[0] = _novoItemEvento;
_eventoArray[1] = _fimThread;
}
private EventWaitHandle _novoItemEvento; private EventWaitHandle _fimThread; private WaitHandle[] _eventoArray;
public EventWaitHandle FimThread{ get { return _fimThread; }
}
public EventWaitHandle NovoItemEvento{ get { return _novoItemEvento; }
}
public WaitHandle[] EventArray{ get { return _eventoArray; }
}
}
public class Produtor{ public Queue _buffer; // Variáveis globais private cls_produto _produto; // Variáveis globais
public Produtor(Queue q, cls_produto e){
_buffer = q;
_produto = e;
}
public void ThreadRun(){ int count = 0; // Variável do metodo threadRun()
Random r = new Random(); // Cria o objeto r do tipo Randomico while (!_produto.FimThread.WaitOne(0, false)){ lock (((ICollection)_buffer).SyncRoot){ while (_buffer.Count < 5000){ _buffer.Enqueue(r.Next(0, 1000)); // quantidade de numeros de cada código alimentado o buffer _produto.NovoItemEvento.Set(); count++;
}
} } Console.WriteLine("Thread Produtor : produzidos " + count + " itens");
}
}
public class Consumidor{ public Consumidor(Queue q, cls_produto e){
_buffer = q;
_produto = e;
}
// Consumidor de ThreadRun public void ThreadRun(){ int count = 0; while (WaitHandle.WaitAny(_produto.EventArray) != 1){ lock (((ICollection)_buffer).SyncRoot){ int item = _buffer.Dequeue();
}
count++;
}
Console.WriteLine("Thread Consumidor : Consumido "+count+ " itens");
}
private Queue _buffer; private cls_produto _produto;
}
public class ThreadSyncSample{ private static void ShowQueueContents(Queue q){ lock (((ICollection)q).SyncRoot){ foreach (int item in q){