private static void Run(int id)
        {
            int fail   = 0;
            var sem0   = new StSemaphore(0);
            var sem1   = new StSemaphore(0);
            var sem2   = new Semaphore(0, int.MaxValue);
            var sem3   = new Semaphore(0, int.MaxValue);
            var stsems = new[] { sem0, sem1 };
            var whsems = new[] { sem2, sem3 };

            VConsole.WriteLine("+++ w #{0} started...", id);
            do
            {
                ThreadPool.QueueUserWorkItem(delegate {
                    sem0.Release(1);
                    sem1.Release(1);
                    Thread.Sleep(0);
                    sem2.Release(1);
                    sem3.Release(1);
                    if (sem1.Wait(1, new StCancelArgs(0)))
                    {
                        Thread.Sleep(0);
                        sem1.Release(1);
                    }
                });

                try {
                    do
                    {
                        if (StWaitable.WaitAll(stsems, whsems, new StCancelArgs(id)))
                        {
                            break;
                        }
                        fail++;
                    } while (true);
                } catch (StThreadAlertedException) {
                    break;
                }

                if ((++counts[id] % 1000) == 0)
                {
                    VConsole.Write("-{0}", id);
                }
            } while (shutdown == 0);
            VConsole.WriteLine("+++ w #{0} exiting: [{1}/{2}]", id, counts[id], fail);
            done.Signal();
        }
Exemplo n.º 2
0
        //
        // Starts the test.
        //

        internal static Action Run()
        {
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            StSemaphore         s       = new StSemaphore(0);
            StNotificationEvent doUnreg = new StNotificationEvent();
            StRegisteredWait    regWait = s.RegisterWait(RegisteredWaitCallback, null, 250, false);

            new UnregisterThread(regWait, doUnreg).Start();
            s.Release(20);
            return(() => {
                doUnreg.Set();
                for (int i = 0; i < 100; i++)
                {
                    s.Release(1);
                }
                Console.ReadLine();
            });
        }
        private static void Run(int id) {
            int fail = 0;
            var sem0 = new StSemaphore(0);
            var sem1 = new StSemaphore(0);
            var sem2 = new Semaphore(0, int.MaxValue);
            var sem3 = new Semaphore(0, int.MaxValue);
            var stsems = new[] { sem0, sem1 };
            var whsems = new[] { sem2, sem3 };

            VConsole.WriteLine("+++ w #{0} started...", id);
            do {
                ThreadPool.QueueUserWorkItem(delegate {
                    sem0.Release(1);
                    sem1.Release(1);
                    Thread.Sleep(0);
                    sem2.Release(1);
                    sem3.Release(1);
                    if (sem1.Wait(1, new StCancelArgs(0))) { 
                        Thread.Sleep(0);
                        sem1.Release(1);
                    }
                });

                try {
                    do { 
                        if (StWaitable.WaitAll(stsems, whsems, new StCancelArgs(id))) {
                            break;
                        }
                        fail++;
                    } while (true);
                } catch (StThreadAlertedException) {
                    break;
                }

                if ((++counts[id] % 1000) == 0) {
                    VConsole.Write("-{0}", id);
                }
            } while (shutdown == 0);
            VConsole.WriteLine("+++ w #{0} exiting: [{1}/{2}]", id, counts[id], fail);
            done.Signal();
        }
        //
        // Starts the test.
        //

        internal static Action Run() {

            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            StSemaphore s = new StSemaphore(0);
            StNotificationEvent doUnreg = new StNotificationEvent();
        	StRegisteredWait regWait = s.RegisterWait(RegisteredWaitCallback, null, 250, false);
            new UnregisterThread(regWait, doUnreg).Start();
	        s.Release(20);
            return () => {
	            doUnreg.Set();
	            for (int i = 0; i < 100; i++) {
		            s.Release(1);
	            }
	            Console.ReadLine();
            };
        }