Browse Source

threading: fixed shutdown bug.

pull/36/head
Marcus Cuda 17 years ago
parent
commit
a78f202b2c
  1. 17
      src/Numerics/Threading/ThreadQueue.cs
  2. 4
      src/UnitTests/ThreadingTests/ParallelForTests.cs

17
src/Numerics/Threading/ThreadQueue.cs

@ -138,16 +138,17 @@ namespace MathNet.Numerics.Threading
while (_running) while (_running)
{ {
// Check whether we should shut down
if (!_running)
{
break;
}
// Get the job... // Get the job...
Task task = null; Task task = null;
lock (_queueSync) lock (_queueSync)
{ {
// Check whether we should shut down
if (!_running)
{
break;
}
if (_queue.Count > 0) if (_queue.Count > 0)
{ {
task = _queue.Dequeue(); task = _queue.Dequeue();
@ -162,10 +163,12 @@ namespace MathNet.Numerics.Threading
{ {
continue; continue;
} }
// ...and run it // ...and run it
task.Compute(); task.Compute();
} }
_isInWorkerThread = false;
} }
/// <summary> /// <summary>

4
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() public void DoesNotGetConfusedByMultipleStartShutdown()
{ {
ThreadQueue.Shutdown(); ThreadQueue.Shutdown();
@ -132,8 +132,8 @@ namespace MathNet.Numerics.UnitTests.ThreadingTests
Assert.AreEqual(2, ThreadQueue.ThreadCount); Assert.AreEqual(2, ThreadQueue.ThreadCount);
var items = new int[50]; var items = new int[50];
Parallel.For(0, items.Length, i => items[i]++); Parallel.For(0, items.Length, i => items[i]++);
Parallel.For(0, items.Length, i => items[i] += 1000); Parallel.For(0, items.Length, i => items[i] += 1000);
ThreadQueue.Shutdown(); ThreadQueue.Shutdown();

Loading…
Cancel
Save