예제 #1
0
        //
        // Constructors.
        //

        public StRendezvousChannel(bool fifoService)
        {
            if (fifoService)
            {
                channel = new FifoRendezvousChannel();
            }
            else
            {
                channel = new LifoRendezvousChannel();
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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;
        }