2016-03-30 28 views
5

Ho un programma strutturato come segue, ed è un enorme maiale della CPU. IO rallenta per l'intero sistema, non riesco a muovere il puntatore del mouse ...Perché il mio programma è un maiale di risorse anche se ho impostato THREAD_MODE_BACKGROUND_BEGIN?

... perché? Pensavo che THREAD_MODE_BACKGROUND_BEGIN avrebbe dovuto impedirlo?

#pragma omp parallel 
{ 
    SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 

    #pragma omp for 
    for (...) 
    { 
     doTruckLoadsOfComputation(); 
     if (omp_get_thread_num()==0) 
      doTinyAmountOfIO(); //progress indicator 
    } 
    SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END); 
} 

UPDATE:

Aggiunta SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL); corregge il problema hogging CPU, ma la questione si ferma, perché non era sola modalità background è sufficiente?

+0

Cosa succede se porti in primo piano un'altra finestra/riduci l'applicazione? – OMGtechy

+0

Non posso, l'altra finestra non viene nemmeno in primo piano. –

+1

Domanda stupida: su quale sistema operativo si sta eseguendo? ['THREAD_MODE_BACKGROUND_BEGIN' /' END' non è supportato prima di Vista] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686277%28v=vs.85%29.aspx), quindi una vecchia macchina WS03 probabilmente non funzionerebbe. Potrebbe essere utile controllare effettivamente il valore restituito da "SetThreadPriority" per assicurarsi che abbia avuto successo. Non è nemmeno chiaro se la modalità di background influenzi effettivamente la priorità di schedulazione della CPU; sembra che sia un addon che modifica la priorità I/O (quali altre impostazioni non lo fanno), ma il comportamento esatto non è documentato correttamente. – ShadowRanger

risposta

0

questo è troppo lungo per un commento

Hai alternative più semplici: START /BELOWNORMAL <yourexe> può eseguire qualsiasi processo arbitrario con priorità più bassa, w/o modificare il codice sorgente.

Se vuoi farlo dall'interno dell'app, un'alternativa molto migliore è per noi uno Job object. Utilizza lo JOBOBJECT_CPU_RATE_CONTROL_INFORMATION per il controllo a grana fine della quantità di CPU che la tua app può consumare. Il vantaggio più importante di JOB rispetto all'affinità di thread è che le restrizioni di lavoro si applicano all'intero processo e a qualsiasi processo generato dal processo controllato.