// hint: no lock deadlock, but why ? public void OnSharedRessource() { var obj1 = new object(); var obj2 = new object(); var haveBeenCompletedFirstLongTask = false; var haveBeenCompletedSecondLongTask = false; var jobFactory = new SimpleJob(); void RunLongTask(object locker1, object locker2, ref bool haveBeenCompleted) { lock (locker1) { jobFactory.DoCorseGrainedJob(1000); lock (locker2) { jobFactory.DoCorseGrainedJob(1000); haveBeenCompleted = true; } } } var thread1 = new Thread(() => RunLongTask(obj1, obj2, ref haveBeenCompletedFirstLongTask)); var thread2 = new Thread(() => RunLongTask(obj2, obj1, ref haveBeenCompletedSecondLongTask)); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); Assert.True(haveBeenCompletedFirstLongTask); Assert.True(haveBeenCompletedSecondLongTask); }
public void OnSharedRessource() { var obj1 = new object(); var obj2 = new object(); Task[] tasks = new Task[2]; var haveBeenCompletedFirstLongTask = false; var haveBeenCompletedSecondLongTask = false; var jobFactory = new SimpleJob(); void RunLongTask(object locker1, object locker2, ref bool haveBeenCompleted) { lock (locker1) { jobFactory.DoCorseGrainedJob(1000); lock (locker2) { jobFactory.DoCorseGrainedJob(1000); haveBeenCompleted = true; } } } tasks[0] = new Task(() => RunLongTask(obj1, obj2, ref haveBeenCompletedFirstLongTask)); tasks[1] = new Task(() => RunLongTask(obj2, obj1, ref haveBeenCompletedSecondLongTask)); tasks[0].Start(); tasks[1].Start(); // FILL_ME_IN Assert.True(haveBeenCompletedFirstLongTask); Assert.True(haveBeenCompletedSecondLongTask); }
public void CreateThread() { var jobFactory = new SimpleJob(); var haveBeenExecuted = false; // Execute the job in a separate thread and be sure it has runned successfully var thread = new Thread(() => { jobFactory.DoCorseGrainedJob(5000); haveBeenExecuted = true; }); thread.Start(); thread.Join(); // Missing something ? // Assert Assert.True(haveBeenExecuted); }
// Hint: what do you know about cancellation into TPL ? // have you code a class that can help you ? // Extra: factorize your idea into an object ;) // We may use it again soon !!! public void OnCancellingThread() { var jobFactory = new SimpleJob(); var haveBeenExecuted = false; IResult result; // Execute the job in a separate thread and be sure it has runned successfully var thread = new Thread(() => { jobFactory.DoCorseGrainedJob(5000); haveBeenExecuted = true; }); thread.Start(); thread.Interrupt(); result = FILL_ME_IN; Assert.False(haveBeenExecuted); Assert.True(result.HasError); Assert.IsType <OperationCanceledException>(result.InternalError); }