public void Exit() { if (m_suspendedThreads.Count > 0) { MicroThread t = m_suspendedThreads.Dequeue(); t.WakeUp(); } m_locked = false; }
public void Increase() { Console.WriteLine("Semaphore:Increase {0} -> {1}", m_value, m_value + 1); m_value++; if (m_value <= 0) { MicroThread t = m_suspendedThreads.Dequeue(); t.WakeUp(); } }
public T Receive() { MicroThread t = MicroThread.CurrentThread; if (m_senders.Count == 0) { m_receivers.Enqueue(t); t.Wait(); } else { MicroThread sender = m_senders.Dequeue(); sender.WakeUp(); } return(m_dataQueue.Dequeue()); }
public void Send(T data) { MicroThread t = MicroThread.CurrentThread; m_dataQueue.Enqueue(data); if (m_receivers.Count == 0) { m_senders.Enqueue(t); t.Wait(); } else { MicroThread receiver = m_receivers.Dequeue(); receiver.WakeUp(); t.Yield(); } }