コード例 #1
0
        private static void DeadlockDetectionExample()
        {
            int numOfThreads = 2;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token3 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token4 = taskScheduler.GetExecutionToken();
            Object resource1 = new object();
            Object resource2 = new object();
            Task   t1        = CreateTaskWithResourceLock(id: 1, token: token1, resource1: resource1, resource2: resource2);
            Task   t2        = CreateTaskWithResourceLock(id: 2, token: token2, resource1: resource2, resource2: resource1);
            Task   t3        = CreateTaskWithResourceLock(id: 3, token: token3, resource1: resource1, resource2: resource2);
            Task   t4        = CreateTaskWithResourceLock(id: 4, token: token4, resource1: resource2, resource2: resource1);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);
            taskScheduler.Register(t3, 3, 2500, token3);
            taskScheduler.Register(t4, 2, 2500, token4);

            t1.Start(taskScheduler);
            t2.Start(taskScheduler);
            t3.Start(taskScheduler);
            t4.Start(taskScheduler);
        }
コード例 #2
0
        private static Task CreateTaskWithResourceLock(int id, SimpleTaskScheduler.ExecutionToken token, Object resource1, Object resource2)
        {
            Task t = new Task(() =>
            {
                int twoHundredMilliseconds = 200;
                for (int i = 0; i < 10; ++i)
                {
                    Task.Delay(twoHundredMilliseconds).Wait();
                    Console.WriteLine($"id: {id}, iteration: {i}");

                    if (i == 1)
                    {
                        Console.WriteLine("Task with id: " + id + " trying to get a resource");
                        int val = token.LockResource(resource1);
                        if (val == 0)
                        {
                            Console.WriteLine("Task with id: " + id + " succeeded getting resource ");
                        }
                        else if (val == 1)
                        {
                            Console.WriteLine("Task with id: " + id + " completed while requesting a resource ");
                            return;
                        }
                        else if (val == 2)
                        {
                            Console.WriteLine("Task with id: " + id + " couldn't lock a resource, would've deadlocked ");
                        }
                    }
                    if (i == 3)
                    {
                        Console.WriteLine("Task with id: " + id + " trying to get a resource");
                        int val = token.LockResource(resource2);
                        if (val == 0)
                        {
                            Console.WriteLine("Task with id: " + id + " succeeded getting resource ");
                        }
                        else if (val == 1)
                        {
                            Console.WriteLine("Task with id: " + id + " completed while requesting a resource ");
                            return;
                        }
                        else if (val == 2)
                        {
                            Console.WriteLine("Task with id: " + id + " couldn't lock a resource, would've deadlocked ");
                        }
                    }

                    if (token.IsCanceled)
                    {
                        return;
                    }
                    if (token.IsPaused)
                    {
                        EventWaitHandle.SignalAndWait(token.TaskPaused, token.TaskContinued);
                    }
                }
            });

            return(t);
        }
コード例 #3
0
        private static void PreemptingExampleNonPreemptingSchedulerMultipleTasks()
        {
            int numOfThreads = 2;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreateNonPreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token3 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token4 = taskScheduler.GetExecutionToken();
            Task t1 = CreateTask(id: 1, token: token1);
            Task t2 = CreateTask(id: 2, token: token2);
            Task t3 = CreateTask(id: 3, token: token3);
            Task t4 = CreateTask(id: 4, token: token4);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);
            taskScheduler.Register(t3, 3, 2500, token3);
            taskScheduler.Register(t4, 2, 2500, token4);

            t1.Start(taskScheduler);
            t2.Start(taskScheduler);
            Task.Delay(1000).Wait();
            t3.Start(taskScheduler);
            t4.Start(taskScheduler);

            taskScheduler.FinishScheduling();
        }
コード例 #4
0
        public void TestTwoTasksRequestingResourcesBothShouldSucceed()
        {
            int numOfThreads = 2;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            Object     resource1 = new object();
            Object     resource2 = new object();
            List <int> list1     = new List <int>();
            List <int> list2     = new List <int>();
            Task       t1        = CreateTaskWithResourceLock(id: 1, token: token1, resource1: resource1, resource2: resource2, list1);
            Task       t2        = CreateTaskWithResourceLock(id: 2, token: token2, resource1: resource2, resource2: resource1, list2);

            taskScheduler.Register(t1, 5, 5000, token1);
            taskScheduler.Register(t2, 4, 5000, token2);

            t1.Start(taskScheduler);
            Task.Delay(500).Wait();
            t2.Start(taskScheduler);

            Task.Delay(5000).Wait();
            Assert.AreEqual(list1.Count, 2);
            Assert.AreEqual(list2.Count, 2);
        }
コード例 #5
0
        private static Task CreateTaskWithResourceLock(int id, SimpleTaskScheduler.ExecutionToken token, Object resource)
        {
            Task t = new Task(() =>
            {
                int twoHundredMilliseconds = 200;
                for (int i = 0; i < 10; ++i)
                {
                    Task.Delay(twoHundredMilliseconds).Wait();
                    Console.WriteLine($"id: {id}, iteration: {i}");

                    if (i == 1)
                    {
                        token.LockResource(resource);
                    }
                    if (i == 7)
                    {
                        token.UnlockResource(resource);
                    }

                    if (token.IsCanceled)
                    {
                        return;
                    }
                    if (token.IsPaused)
                    {
                        EventWaitHandle.SignalAndWait(token.TaskPaused, token.TaskContinued);
                    }
                }
            });

            return(t);
        }
コード例 #6
0
        public void Test10TasksOn5ThreadsPreemptingEachOther()
        {
            int numOfThreads = 5;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token3  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token4  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token5  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token6  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token7  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token8  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token9  = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token10 = taskScheduler.GetExecutionToken();
            Object resource = new object();
            Task   t1       = CreateTaskWithResourceLock(id: 1, token: token1, resource: resource);
            Task   t2       = CreateTaskWithResourceLock(id: 2, token: token2, resource: resource);
            Task   t3       = CreateTaskWithResourceLock(id: 3, token: token3, resource: resource);
            Task   t4       = CreateTaskWithResourceLock(id: 4, token: token4, resource: resource);
            Task   t5       = CreateTaskWithResourceLock(id: 5, token: token5, resource: resource);
            Task   t6       = CreateTaskWithResourceLock(id: 6, token: token6, resource: resource);
            Task   t7       = CreateTaskWithResourceLock(id: 7, token: token7, resource: resource);
            Task   t8       = CreateTaskWithResourceLock(id: 8, token: token8, resource: resource);
            Task   t9       = CreateTaskWithResourceLock(id: 9, token: token9, resource: resource);
            Task   t10      = CreateTaskWithResourceLock(id: 10, token: token10, resource: resource);

            taskScheduler.Register(t1, 1, 2500, token1);
            taskScheduler.Register(t2, 2, 2500, token2);
            taskScheduler.Register(t3, 3, 2500, token3);
            taskScheduler.Register(t4, 4, 2500, token4);
            taskScheduler.Register(t5, 5, 2500, token5);
            taskScheduler.Register(t6, 6, 2500, token6);
            taskScheduler.Register(t7, 7, 2500, token7);
            taskScheduler.Register(t8, 8, 2500, token8);
            taskScheduler.Register(t9, 9, 2500, token9);
            taskScheduler.Register(t10, 10, 2500, token10);

            t1.Start(taskScheduler);
            t2.Start(taskScheduler);
            t3.Start(taskScheduler);
            t4.Start(taskScheduler);
            t5.Start(taskScheduler);
            t6.Start(taskScheduler);
            t7.Start(taskScheduler);
            t8.Start(taskScheduler);
            t9.Start(taskScheduler);
            t10.Start(taskScheduler);
            Task.Delay(15000).Wait();
            Assert.IsTrue(t1.IsCompleted);
            Assert.IsTrue(t2.IsCompleted);
            Assert.IsTrue(t3.IsCompleted);
            Assert.IsTrue(t4.IsCompleted);
            Assert.IsTrue(t5.IsCompleted);
            Assert.IsTrue(t6.IsCompleted);
            Assert.IsTrue(t7.IsCompleted);
            Assert.IsTrue(t8.IsCompleted);
            Assert.IsTrue(t9.IsCompleted);
            Assert.IsTrue(t10.IsCompleted);
        }
コード例 #7
0
        public void TestThreeTasksOnTwoThreadsPreemptingEachOther()
        {
            int numOfThreads = 2;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token3 = taskScheduler.GetExecutionToken();
            Object resource = new object();
            Task   t1       = CreateTaskWithResourceLock(id: 1, token: token1, resource: resource);
            Task   t2       = CreateTaskWithResourceLock(id: 2, token: token2, resource: resource);
            Task   t3       = CreateTask(id: 3, token: token3);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);
            taskScheduler.Register(t3, 3, 2500, token3);

            t1.Start(taskScheduler);
            Task.Delay(500).Wait();
            t2.Start(taskScheduler);
            t3.Start(taskScheduler);

            Task.Delay(5000).Wait();
            Assert.AreEqual(taskScheduler.CurrentlyExecutingTasksCount(), 0);
        }
コード例 #8
0
        private static Task CreateTaskWithResourceLock(int id, SimpleTaskScheduler.ExecutionToken token, Object resource1, Object resource2, List <int> listCount)
        {
            Task t = new Task(() =>
            {
                int twoHundredMilliseconds = 200;
                for (int i = 0; i < 10; ++i)
                {
                    Task.Delay(twoHundredMilliseconds).Wait();
                    Console.WriteLine($"id: {id}, iteration: {i}");

                    if (i == 1)
                    {
                        int val = token.LockResource(resource1);
                        if (val == 0)
                        {
                            listCount.Add(0);
                        }
                        else if (val == 1)
                        {
                            return;
                        }
                        else if (val == 2)
                        {
                        }
                    }
                    if (i == 3)
                    {
                        int val = token.LockResource(resource2);
                        if (val == 0)
                        {
                            listCount.Add(0);
                        }
                        else if (val == 1)
                        {
                            return;
                        }
                        else if (val == 2)
                        {
                        }
                    }

                    if (token.IsCanceled)
                    {
                        return;
                    }
                    if (token.IsPaused)
                    {
                        EventWaitHandle.SignalAndWait(token.TaskPaused, token.TaskContinued);
                    }
                }
            });

            return(t);
        }
コード例 #9
0
        private static void SingleThreadPreemptingExampleNonPreemptingScheduler()
        {
            int numOfThreads = 1;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreateNonPreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            Task t1 = CreateTask(id: 1, token: token1);
            Task t2 = CreateTask(id: 2, token: token2);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);

            t1.Start(taskScheduler);
            Task.Delay(1000).Wait();
            t2.Start(taskScheduler);
            taskScheduler.FinishScheduling();
        }
コード例 #10
0
        public void TestTwoTasksWithNoResourceLocking()
        {
            int numOfThreads = 1;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            Task t1 = CreateTask(id: 1, token: token1);
            Task t2 = CreateTask(id: 2, token: token2);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);

            t1.Start(taskScheduler);
            Task.Delay(500).Wait();
            t2.Start(taskScheduler);
            Assert.AreEqual(taskScheduler.CurrentlyExecutingTasksCount(), 1);
        }
コード例 #11
0
        private static void PriorityInversionExample2()
        {
            int numOfThreads = 1;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            Object resource = new Object();
            Task   t1       = CreateTaskWithResourceLockAndUnlockResource(id: 1, token: token1, resource);
            Task   t2       = CreateTaskWithResourceLockAndUnlockResource(id: 2, token: token2, resource);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);

            t1.Start(taskScheduler);
            Task.Delay(1000).Wait();
            t2.Start(taskScheduler);
            taskScheduler.FinishScheduling();
        }
コード例 #12
0
        public void TestTwoTasksWithOneResourceLockingAndGettingMaxPriority()
        {
            int numOfThreads = 1;
            SimpleTaskScheduler taskScheduler = SimpleTaskScheduler.CreatePreemptive(numOfThreads);

            SimpleTaskScheduler.ExecutionToken token1 = taskScheduler.GetExecutionToken();
            SimpleTaskScheduler.ExecutionToken token2 = taskScheduler.GetExecutionToken();
            Task t1 = CreateTaskWithResourceLock(id: 1, token: token1, resource: new object());;
            Task t2 = CreateTask(id: 2, token: token2);

            taskScheduler.Register(t1, 5, 2500, token1);
            taskScheduler.Register(t2, 4, 2500, token2);

            t1.Start(taskScheduler);
            Task.Delay(500).Wait();
            t2.Start(taskScheduler);
            Task.Delay(2000).Wait();

            Assert.IsTrue(taskScheduler.IsTaskCurrentlyExecuting(t2));
        }
コード例 #13
0
        private static Task CreateTask(int id, SimpleTaskScheduler.ExecutionToken token)
        {
            const int NUM_ITERATIONS         = 10;
            int       twoHundredMilliseconds = 200;
            Task      t = new Task(() =>
            {
                for (int i = 0; i < NUM_ITERATIONS; ++i)
                {
                    Task.Delay(twoHundredMilliseconds).Wait();
                    Console.WriteLine($"id: {id}, iteration: {i}");

                    if (token.IsCanceled)
                    {
                        return;
                    }
                    if (token.IsPaused)
                    {
                        EventWaitHandle.SignalAndWait(token.TaskPaused, token.TaskContinued);
                    }
                }
            });

            return(t);
        }