2016-03-23 11 views
0

Ich habe einen Thread, der in einer Schleife läuft und Aufgaben ausführt.Wie kann ich das weniger CPU-intensiv machen?

outTask::Task* task; 
while (!m_out_stop) { 
    println("abc"); 
    while (m_outQueue.pop(task)) { 
     println("123"); 
     task->execute(); 
    } 
} 

Wie kann ich dies weniger CPU-intensiv machen? Ich könnte den Thread zwischen jeder Aufgabe schlafen lassen, aber das würde eine Verzögerung verursachen und ist daher keine ideale Lösung.

Ps. Druckanweisungen dienen zum Debuggen.

+0

mit Boost Sie boost :: könnte this_thread :: yield() . withh C++ 11 könnte man std :: this_thread :: yield() verwenden – user5976242

+0

@ user5976242 Mindestens auf Windows reduziert 'yield' die CPU-Auslastung nicht. Wenn Sie nachgeben, aber der Scheduler keine anderen Threads zum Planen auf dieser CPU hat, wird der Thread einfach sofort neu geplant, wodurch die CPU gedrosselt wird. – sbabbi

+0

@sbabbi Sie haben Recht. Ich glaube, ich verstehe das Problem einfach nicht. Wenn kein anderer Thread zur Ausführung bereit ist, möchte ich die maximale CPU verwenden, um meine Aufgabe zu erledigen (es ist mir egal, ob sie CPU-intensiv ist). Wenn meine Aufgabe jedoch darin besteht, die CPU in den Griff zu bekommen und zu verhindern, dass andere Threads reibungslos reagieren, sollte ich nachgeben. – user5976242

Antwort

0

Wenn Sie in Windows arbeiten SetThreadPriority verwenden:

outTask::Task* task; 
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL); 
while (!m_out_stop) { 
..... 

Es langsamste Ihre Arbeitsfaden laufen macht, aber nicht stoppen es

+0

Danke. Ist das plattformübergreifend? – KaareZ

+0

Nein, ich sage Ihnen in meiner Antwort ("Wenn Sie in Windows arbeiten") –

+0

Sorry, verpasst das. Mein Fehler – KaareZ