4 Stimmen

Kombinieren Sie Warteschleifen?

Ich denke, das ist eine interessante Frage. Ich habe eine Klasse, die für das "Multiplexing" einer Reihe von Verarbeitungsvorgängen auf eine feste Anzahl von Threads verantwortlich ist. Der typische Fall ist eine Art von Producer/Consumer-Problem, wo jede Operation besteht aus einem WaitHandle (in diesem Fall, die Semaphore, die verfolgt, wie viele Elemente in der Warteschlange sind) und ein Delegat aufzurufen.

Wenn ich zum Beispiel zwei Produzenten (A und B) habe, die Artikel in zwei getrennten Warteschlangen produzieren. Anstatt zwei Verbraucher-Threads für jeden Produzenten (A1,A2,B1,B2) zu erstellen, multiplexe ich die vier Verbraucher-"Threads" auf zwei Threads. Der Code für diesen "Multiplexer" läuft etwa so ab (etwas vereinfacht):

WaitHandle[] waitHandles = new WaitHandle[2];
waitHandles[0] = NumberOfItemsFullInProducerAQueue;
waitHandles[1] = NumberOfItemsFullInProducerBQueue;
while(true)
{
    int index = WaitHandle.WaitAny(waitHandles);
    if(index == 0)
    {
        // handle the item from queue A
    }
    else
    {
        // handle the item from queue B
    }
}

Ich versuche, dieses Konzept auf ein etwas komplizierteres Beispiel auszudehnen, bei dem eine Aktion möglicherweise mehrere Warte-Handles benötigt, um erfüllt zu werden, bevor sie ausgeführt wird. Ich frage mich, ob es eine Art von WaitHandle.Combine(waitHandle1, waitHandle2)-Aufruf gibt, den ich machen kann, um zwei Warte-Handles zu einem einzigen Warte-Handle zusammenzufassen. Das Endergebnis wäre etwas wie:

A,B,C,D are waitHandles
E = Combine(A, B)
F = Combine(C, D)
waitHandles = { E, F }

while(true)
{
   int index = WaitHandle.WaitAny(waitHandles);
   if(index == 0)
   {
   }
   else
   {
   }
}

Extra Punkte?

Es ist zwar keine Voraussetzung, aber es wäre auch sehr schön, wenn sich die Kombinationen der Wartegriffe überschneiden könnten. Zum Beispiel, so etwas wie dieses:

  A,B,C are waitHandles
  D = Combine(A, B)
  E = Combine(A, C)
  waitHandles = { D, E }
  // same as above from here

Danke für Ihre Hilfe SO

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X