From a78f202b2c59df7289c2bbfb39f5e99cf18a0908 Mon Sep 17 00:00:00 2001 From: Marcus Cuda Date: Fri, 5 Feb 2010 17:04:11 +0800 Subject: [PATCH] threading: fixed shutdown bug. --- src/Numerics/Threading/ThreadQueue.cs | 17 ++++++++++------- .../ThreadingTests/ParallelForTests.cs | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Numerics/Threading/ThreadQueue.cs b/src/Numerics/Threading/ThreadQueue.cs index 5fb23253..348a91ca 100644 --- a/src/Numerics/Threading/ThreadQueue.cs +++ b/src/Numerics/Threading/ThreadQueue.cs @@ -138,16 +138,17 @@ namespace MathNet.Numerics.Threading while (_running) { - // Check whether we should shut down - if (!_running) - { - break; - } - // Get the job... Task task = null; + lock (_queueSync) { + // Check whether we should shut down + if (!_running) + { + break; + } + if (_queue.Count > 0) { task = _queue.Dequeue(); @@ -162,10 +163,12 @@ namespace MathNet.Numerics.Threading { continue; } - + // ...and run it task.Compute(); } + + _isInWorkerThread = false; } /// diff --git a/src/UnitTests/ThreadingTests/ParallelForTests.cs b/src/UnitTests/ThreadingTests/ParallelForTests.cs index 7dbe1265..ea0c344c 100644 --- a/src/UnitTests/ThreadingTests/ParallelForTests.cs +++ b/src/UnitTests/ThreadingTests/ParallelForTests.cs @@ -108,7 +108,7 @@ namespace MathNet.Numerics.UnitTests.ThreadingTests } } - [Test, ApartmentState(ApartmentState.MTA), Timeout(15)] + [Test, MultipleAsserts, ApartmentState(ApartmentState.MTA), Timeout(15)] public void DoesNotGetConfusedByMultipleStartShutdown() { ThreadQueue.Shutdown(); @@ -132,8 +132,8 @@ namespace MathNet.Numerics.UnitTests.ThreadingTests Assert.AreEqual(2, ThreadQueue.ThreadCount); var items = new int[50]; - Parallel.For(0, items.Length, i => items[i]++); + Parallel.For(0, items.Length, i => items[i] += 1000); ThreadQueue.Shutdown();