Napisałem bibliotekę C++, która wykonuje kilka poważnie ciężkich zadań procesora (wszystko to z matematyki i obliczeń) i jeśli zostawi się je własnemu urządzeniu, z łatwością zużyje 100% wszystkich dostępnych zasobów procesora (jest również wielowątkowe do liczby dostępne rdzenie logiczne na komputerze).Najlepszy sposób na spowolnienie wątku? Czy używasz trybu uśpienia()?
Jako takie, mam zwrotnego wewnątrz pętli głównej obliczeniowego, że oprogramowanie z biblioteki ma zadzwonić:
while(true)
{
//do math here
callback(percent_complete);
}
w wywołanie zwrotne, klient zwraca uśpienia (x), aby spowolnić wątek.
Pierwotnie kod klienta był stałym wywołaniem funkcji Sleep (100), ale doprowadziło to do złej zawodności, ponieważ niektóre maszyny kończą matematykę szybciej niż inne, ale sen jest taki sam na wszystkich komputerach. Teraz klient sprawdza czas systemowy, a jeśli minęło więcej niż 1 sekundę (co == kilka iteracji), będzie spał przez pół sekundy.
Czy jest to dopuszczalny sposób spowolnienia wątku? Czy powinienem używać semafora/mutex zamiast Sleep(), aby zmaksymalizować wydajność? Czy spanie x milisekundy na każdą 1 sekundę obróbki działa dobrze, czy coś jest nie tak, czego nie dostrzegam?
Powodem, dla którego pytam, jest to, że maszyna nadal jest mocno zagłuszana, mimo że Taskman pokazuje proces zajmujący około 10% CPU. Już odkryłem rywalizację o dysk twardy i pamięć bez skutku, więc teraz zastanawiam się, czy przyczyną tego problemu jest sposób, w jaki spowalniam wątek.
Dzięki!
W systemie Linux, jeśli uruchomisz proces na wyższym, ładnym poziomie, system operacyjny będzie utrzymywał niski poziom zegara procesora, zakładając, że twój sprzęt obsługuje skalowanie szybkości procesora. Pozwoli to utrzymać niski poziom mocy, ciepła i hałasu bez sztucznego dławienia. – karunski
Słodki. Przejście na Linuksa jest opcją, którą stale rozważam i jak dotąd zawsze odrzucam ... –