Concurrent collections Essen zu viel cpu ohne Gewinde.Schlafen

Was wäre die korrekte Verwendung von entweder BlockingCollection oder ConcurrentQueue so können Sie frei dequeue Elemente ohne Sie zu verbrennen, sich die Hälfte oder mehr der CPU einen thread ?

Ich lief einige tests mit 2 threads und es sei denn, ich hatte einen Thread.Schlaf von mindestens 50~100ms würde es treffen immer mindestens 50% meiner CPU.

Hier ist ein fiktives Beispiel:

private void _DequeueItem()
{
    object o = null;
    while(socket.Connected)
    {
        while (!listOfQueueItems.IsEmpty)
        {
            if (listOfQueueItems.TryDequeue(out o))
            {
                //use the data
            }
        }
    }
}

Mit dem obigen Beispiel würde ich ein thread.schlafen, damit die cpu nicht sprengen.

Hinweis: ich habe auch versucht es ohne, während für die IsEmpty-Prüfung, Ergebnis war das gleiche.

  • Wenn Sie nichts tun, außer dequeueing dann 50% CPU-Auslastung ziemlich normal ist, im Allgemeinen mit den Threads ist es noch wichtiger, schauen Sie sich die einzelnen Kerne um die Leistung zu beurteilen.
  • das klingt nicht richtig, abarbeiten der Warteschlange ist ein kleiner Betrieb. Das problem hier ist der thread sollte auf ein signal warten, um aufzuwachen, das signal sagen, es gibt etwas zu entfernen, anstatt mit einer unendlich engen Schleife zu versuchen, die Warteschlange entfernen. Das würde eine WINZIGE Menge der CPU, bei weitem nicht 50%
  • Sie haben Recht, ich verpasst - war gerade auf der Suche auf die schlechte Idee, um nicht ansehen Familienmitglied Kerne!
InformationsquelleAutor Prix | 2011-07-01
Schreibe einen Kommentar