Hvor mange tråde venter i en Monitor
Hej eksperterJeg har begivet mig ud i en paralleliseret version af Branch and Bound. Mit problem er, at stoppe algoritmen på en pæn måde.
Jeg opretter n tråde, der deler en pool af live-nodes(opgaver). Princippet i algoritmen er, at hver tråd consumer en node fra live-poolen og ud fra denne producerer 2 nye child-nodes, der igen tilføjes til poolen.
Da algoritmen starter med 1 rodknude, så vil der i i starten ikke være lige så mange nodes i live-pool, som der er Worker-tråde. Derfor har jeg implementeret producer/consumer logik som følger, for at undgå, at trådene dør, når de ikke har noget at lave:
http://www.yoda.arachsys.com/csharp/threads/deadlocks.shtml
readonly object _livePoolLock = new object();
public void Add(Node newNode)
{
lock (_livePoolLock)
{
_openNodes.Insert(newNode);
// We always need to pulse, even if the queue wasn't
// empty before. Otherwise, if we add several items
// in quick succession, we may only pulse once, waking
// a single thread up, even if there are multiple threads
Monitor.Pulse(_livePoolLock);
}
}
public Node NextNode()
{
lock (_livePoolLock)
{
// If the queue is empty, wait for an item to be added
// Note that this is a while loop, as we may be pulsed
// but not wake up before another thread has come in and
// consumed the newly added object. In that case, we'll
// have to wait for another pulse.
while (_openNodes.Count == 0)
{
// This releases _livePoolLock, only reacquiring it
// after being woken up by a call to Pulse
Monitor.Wait(_livePoolLock);
}
return _openNodes.ExtractMin();
}
}
Men nu kommer udfordringen. På et tidspunkt er det fuldstændige søgetræ opbygget og ingen af trådene kan producere nye nodes til køen = deadlock.
Slutkriteriet for algoritmen må være, når der ikke er flere nodes i live-poolen og når alle tråde venter i monitoren.
Men hvordan bestemmer man den hændelse. Der er ikke nogen Monitor.WaitingThreadsCount.