/ / Nastavenie priorít vlákien z bežiaceho procesu - c ++, multithreading, winapi

Nastavenie priorít vlákien z bežiaceho procesu - c ++, multithreading, winapi

Ja som sa práve stretol dostať/SetThreadPriority metódy a dostali ma premýšľať - môže byť prioritou zmysluplne byť nastavená vyššia ako priorita vlastného procesu (čo si nemyslím, že sa dá zmeniť programovo rovnakým spôsobom)?

Existujú nejaké úskalia pri používaní týchto rozhraní API?

odpovede:

2 pre odpoveď č. 1

Áno, prioritu vlákna môžete nastaviť na ľubovoľnútriedy, vrátane triedy vyššej ako je aktuálny proces. V skutočnosti sú tieto dve hodnoty komplementárne a poskytujú základnú prioritu vlákna. Môžete si o tom prečítať v sekcii Poznámky na odkaz, ktorý ste uverejnili.

Prioritu procesu môžete nastaviť pomocou SetPriorityClass.

Teraz, keď sme sa dostali z technickejspôsobom sa mi zdá, že málo využívam na priamu manipuláciu s prioritou vlákna. Plánovač OS je dostatočne sofistikovaný na zvýšenie priority vlákien blokovaných v I / O cez vlákna, ktoré robia výpočty CPU (do tej miery, že I / O vlákno predbehne vlákno CPU, keď príde prerušenie I / O). V skutočnosti sú dokonca aj vstupno-výstupné vlákna diferencované, pričom vstupné / výstupné vlákna klávesnice získavajú prioritné zvýšenie napr.


1 pre odpoveď č. 2

V systéme Windows sa priority vlákien a procesov kombinujú pomocou algoritmu, ktorý rozhoduje o celkovej priorite plánovania:

Windows priority

Úskalia? No:

Je pravdepodobné, že sa zvýši priorita vláknadajte najväčší celkový zisk, ak je zvyčajne blokovaný na IO, ale musí spustiť ASAP afer, ktorý signalizuje jeho vodič, napr. Video IO, ktoré musí rýchlo spracovávať buffery.

Pravdepodobne bude mať zvýšenie priority vlákiennajväčší celkový negatívny vplyv, ak sú viazané na CPU a zvýšené na vysokú prioritu, čím sa zabraňuje spusteniu vlákien s normálnou prioritou. Ak sa vezmú do extrémov, OS vlákna a pomôcky ako Task Manger sa nespustia.