• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Blokowanie wątku. Alternatywa dla while(true)

VPS Starter Arubacloud
0 głosów
434 wizyt
pytanie zadane 18 lutego 2016 w C i C++ przez Exus Początkujący (420 p.)

Witam

Piszę aplikacje w której potrzebuję cały czas sprawdzać np. wartość jakiejś zmiennej i gdy zdarzy się tak że przyjmie oczekiwaną wartość wykonać jakieś działanie i to wszystko w tle czyli w innym wątku, taki daemon. Mógłbym użyć do tego nieskończonej pętli ale pętla taka zżera trochę procesora no i niezbyt chcę używać sleepów bo chciałbym uzyskać jak najkrótszą reakcje.

Chciałbym uzyskać coś w tym stylu:

while(true) {
    if(JakisObiekt->wartosc == true) {  // Fajnie byłoby to zablokować jak np. blokuje się recv(), mutex.lock(), select() itp.

        // Wykonywane instrukcje

    }
}

Takie rozwiązanie byłoby dobre gdybym dał tam np. sleep(10000) wtedy mam znikome użycie procesora no ale czas reakcji znacząco wzrasta.

Istnieje jakiś sposób na zablokowanie programu do czasu spełnienia się jakiegoś warunku, eventu? Jakaś funkcja w stylu recv(), select()? Może istnieje jakiś sposób na ograniczenie użycia procesora w nieskończonej pętli bez sleep() ?

Z góry dziękuję za wszystkie odpowiedzi. ;)

1 odpowiedź

+1 głos
odpowiedź 18 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
Niestety, uśpienie danego wątku jest jedynym sposobem na ograniczenie jego zasobożerności, ale możesz ustawić odpowiednio mały czas - przecież gry komputerowe wyświetlają się z częstotliwością ok. 60Hz, więc i tyle razy na sekundę wykona się jakakolwiek operacja w takim programie.

Mam nadzieję, że korzystasz z kolejki zdarzeń?
komentarz 18 lutego 2016 przez Exus Początkujący (420 p.)
Nie korzystam. To nie jest gra komputerowa :D a raczek trochę jakby "serwer". Muszę utrzymać połączenie telnet przy życiu czyli co jakiś czas wysłać jakąś wiadomość i zignorować odpowiedź i tak na wielu gniazdach. Tylko tutaj sleep będzie idealny. Tylko że mam jeszcze inne moduły które mają być uruchomione w oddzielnych wątkach i przez większość swojego czasu wykonania pobierają jakieś dane przez socket i w zależności od wyniku wykonują jakąś czynność lub nie więc chciałem jak najbardziej zoptymalizować zużycie procesora przez właśnie te wątki. Jeszcze najgorsze jest to że prawdopodobnie będzie to działać na jednordzeniowym procesorze. :D
komentarz 18 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)

Wybacz, że pisałem o tej kolejce zdarzeń... przed oczami miałem cały czas słowo "event" i zapomniałem, o co ci, tak na prawdę, chodzi wink

Tak jak już pisałem, jedynym wyjściem jest uśpienie wątku, ale jeśli program ma jak najszybciej badać wartość danej zmiennej, to niestety, ale nie masz już żadnego wyboru - dyspozycyjność programu ma swoją cenę, ale nie sądzę, aby zużycie procesora było wyższe, niż te 20 - 30%.

komentarz 18 lutego 2016 przez Exus Początkujący (420 p.)
Myślę że bez problemu dam radę. Pytanie też zadałem tak z ciekawości bo zawsze jak robiłem coś takiego to myślałem "Ja tu używam nieskończonej pętli a może jest coś takiego co wstrzyma mi program do np. zmiany wartości jakiejś zmiennej". :D Także dzięki za odpowiedź. ;)
komentarz 18 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
Aż tak zielono to nie jest, gdyż to "wstrzymanie" też by musiało sprawdzać, kiedy zmienna zmieniło swoją wartość, a przecież to także zajmowałoby czas procesora.

Podobne pytania

0 głosów
3 odpowiedzi 472 wizyt
pytanie zadane 24 stycznia 2016 w C i C++ przez Dash Nałogowiec (29,650 p.)
0 głosów
0 odpowiedzi 79 wizyt
pytanie zadane 29 stycznia w Sieci komputerowe, internet przez Kamil94 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 159 wizyt

92,775 zapytań

141,703 odpowiedzi

320,566 komentarzy

62,109 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...