// // Constructors. // public StRendezvousChannel(bool fifoService) { if (fifoService) { channel = new FifoRendezvousChannel(); } else { channel = new LifoRendezvousChannel(); } }
public void WithOneClientAndOneServerThreadByRunningServerFirst() { var synchronizer = new RendezvousChannel <int, int>(); var waitingToStart = new ManualResetEvent(false); var server = new Thread(() => { int service; waitingToStart.Set(); var myToken = (RendezvousChannel <int, int> .Token)synchronizer.Accept(Timeout.Infinite, out service); synchronizer.Reply(myToken, myToken.service * 2); }); server.Start(); int response; waitingToStart.WaitOne(); if (synchronizer.Request(2, Timeout.Infinite, out response)) { Assert.AreEqual(4, response); } }
private static bool TestRendezvousChannel() { const int RUN_TIME = 15000; const int SETUP_TIME = 20; const int servers = 50; const int clients = 10; Thread[] srthrs = new Thread[servers]; Thread[] clthrs = new Thread[clients]; Dictionary<int, int> results = new Dictionary<int,int>(); int[] serversCounters = new int[servers]; int[] clientsCounters = new int[clients]; int[] interruptCounters = new int[servers + clients]; int sentInterrupts = 0; ManualResetEventSlim startEvent = new ManualResetEventSlim(false); RendezvousChannel<int,int> channel = new RendezvousChannel<int,int>(); for (int i = 0; i < clients; i++) { int tid = i; clthrs[i] = new Thread(() => { // Wait the start for all threads startEvent.Wait(); int response; int endTime = Environment.TickCount + RUN_TIME; //do //{ do { try { channel.Request(tid+1 , tid+100 , out response); break; } catch (ThreadInterruptedException) { interruptCounters[tid]++; } } while (true); //Thread.Yield(); //rwLock.EndRead(); if ((++clientsCounters[tid] % 1000) == 0) { Console.Write("[#C{0}]", tid); } //} while (Environment.TickCount < endTime); results.Add(tid + 1, response); try { Thread.Sleep(0); } catch (ThreadInterruptedException) { interruptCounters[tid]++; } }); clthrs[i].Start(); } for (int i = 0; i < servers; i++) { int tid = i; srthrs[i] = new Thread(() => { RendezvousChannel<int, int>.RendezVousToken token; // Wait the start for all threads startEvent.Wait(); int service; int endTime = Environment.TickCount + RUN_TIME; //do //{ do { try { token = (RendezvousChannel<int, int>.RendezVousToken)channel.Accept(tid + 100, out service); break; } catch (ThreadInterruptedException) { interruptCounters[tid + clients]++; } } while (true); //Thread.Yield(); //rwLock.EndWrite(); if ((++serversCounters[tid] % 1000) == 0) { Console.Write("[#S{0}]", tid); } //} while (Environment.TickCount < endTime); int response = tid+1; if(token != null) channel.Reply(token, response); try { Thread.Sleep(0); } catch (ThreadInterruptedException) { interruptCounters[tid + clients]++; } }); srthrs[i].Start(); } // Sleep for a while and then unblock the test threads. Thread.Sleep(SETUP_TIME); startEvent.Set(); Thread.Sleep(RUN_TIME); // Wait until all threads have been terminated. for (int i = 0; i < servers + clients; i++) { if (i < servers) srthrs[i].Join(); else clthrs[i - servers].Join(); } // Show results Console.WriteLine("\nServers counters:"); for (int i = 0; i < servers; i++) { if ((i % 5) == 0) Console.WriteLine(); Console.Write("[#C{0}: {1,4}]", i, serversCounters[i]); } Console.WriteLine("\nClient counters:"); for (int i = 0; i < clients; i++) { if ((i % 5) == 0) Console.WriteLine(); Console.Write("[#S{0}: {1,4}", i, clientsCounters[i]); } Console.WriteLine("\ninterrupt counters:"); int sum = 0; for (int i = 0; i < servers + clients; i++) { sum += interruptCounters[i]; if ((i % 5) == 0) Console.WriteLine(); Console.Write("[#{0}: {1,4}]", i, interruptCounters[i]); } Console.WriteLine("\nsent interrupts: {0}, received: {1}", sentInterrupts, sum); for (int i = 0; i < clients; ++i) { KeyValuePair<int,int> key= results.ElementAt(i); Console.WriteLine("pedido - {0} ; response - {1}" , key.Key , key.Value); } return true; }