2016-12-10 8 views
0

Also schrieb ich ein Multi-Thread-Programm mit boost :: lockfree :: queue, und der Code ist so ziemlich das gleiche wie das angegebene Beispiel http://www.boost.org/doc/libs/1_62_0/doc/html/lockfree/examples.html. Nun, ich habe 4 Warteschlangen und die Daten sind eher eine Struktur als int.boost :: lockfree :: queue frisst meine CPU

Das Problem ist, dass mein Programm 95% meiner CPU beim Laufen verbraucht und es ist super langsam. Nach einer kleinen Untersuchung fand heraus, dass ich, dass boost :: lockfree :: Queue :: pop 80% der CPU-Auslastung nimmt, die aufgrund dieser beiden Schleifen ist nicht überraschend

while (!done) { 
    while (queue.pop(value)) 
     ++consumer_count; 
} 

Gibt es etwas, was ich tun kann Reduzieren Sie die CPU-Nutzung oder sollte ich meine CPUs upgraden? Ich benutze Boost 1.61, Visual Studio 2015 auf Windows 10, BTW.

Vielen Dank

+1

Ich denke, Sie haben den ganzen Punkt der Lockfree-Warteschlange verpasst. Sie möchten wahrscheinlich eine blockierende Warteschlange! Der Punkt von Lockfree/Waitfree-Warteschlangen ist, dass keine explizite Blockierungssynchronisation erforderlich ist, um gleichzeitig in die Warteschlange zu schreiben und zu lesen. Auf diese Weise können Sie den Overhead von Sperrkonflikten vermeiden und haben ein recht vorhersehbares Lese-/Schreib-Timing-Verhalten. Deine Threads sollen tatsächlich die ganze Zeit funktionieren und niemals blockieren. Wenn Sie nicht möchten, dass Sie warten möchten, bis etwas in der Warteschlange verfügbar ist, verwenden Sie eine blockierende Warteschlangenimplementierung. – pokey909

Antwort

0

Was haben Sie erwartet? Das folgende Stück Code ist das gleiche wie Sie (in Bezug auf das Essen CPU)

int counter = 0; 
bool condition_1 = false; 
bool condition_2 = false; 
while(!condition_1) { 
    while(!condition_2) { 
    ++counter; 
    condition_2 = true; 
    } 
} 

Was Sie brauchen, IMHO, ist einige Benachrichtigungsmechanismus (z condition_variable), wenn Umfrage Warteschlange. Ansonsten, es ständig pollend, isst offensichtlich CPU.

Verwandte Themen