Avatar billede sandrasmurf Nybegynder
04. november 2009 - 17:00 Der er 2 kommentarer og
1 løsning

Hvor mange tråde venter i en Monitor

Hej eksperter

Jeg 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.
Avatar billede dinirex Nybegynder
05. november 2009 - 22:53 #1
Kan du ikke bruge en join? Således at trådene skal vente på hinanden, også først køre videre når alle er samlet?
Avatar billede sandrasmurf Nybegynder
06. november 2009 - 02:24 #2
MSDN - Thread:Join Method
Blocks the calling thread until a thread terminates, while continuing to perform standard COM and SendMessage pumping.

Er ikke helt med på, hvordan du vil bruge Join? Worker trådene terminerer netop ikke af sig selv. Det er hele problemet. Når der ikke produceres flere opgaver, bliver alle trådene sat til at vente i GetNext metoden og der kan de wait'e for evigt.

Den tricky del er, at Worker trådene både er producer og consumer. Efter at have consumet en opgave er worker trådene i stand til at generere flere nye opgaver. Altså indtil, der på et tidspunkt ikke længere er flere variable at branche på og alle tråde derfor kun consumer.
Avatar billede sandrasmurf Nybegynder
06. november 2009 - 15:01 #3
Jeg lukker spørgsmålet. Ser ikke ud til, at der findes en umiddelbar løsning. Jeg må tænke videre over problemstillingen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester