W językach C i C++ istnieje międzyplatformowy sposób uzyskiwania wątku? Coś jak sched_yield() lub Sleep (0)? Czy SDL_Delay (0) zawsze ustępuje, czy też zwróci natychmiast w niektórych implementacjach?Wieloplatformowy sposób uzyskiwania wątku w C/C++?
Odpowiedz
Biorąc pod uwagę, że ani C, ani C++ (aż do C++ 98) nie ma "wątków", nie ma w pełni międzyplatformowego sposobu dostarczania wątku.
W C++ 0x dostępna jest funkcja std::this_thread::yield()
, którą można wywołać w celu uzyskania. To będzie przenośny sposób na dostarczenie wątku, gdy ludzie zaczną używać biblioteki wątków C++ 0x.
Rozumiem, że to nie jest wbudowane w język. Zastanawiam się głównie, czy jest dostępna biblioteka, która to robi, stąd komentarz do SDL_Delay. – Shum
@Shum: niezależnie od tego, z jakiej biblioteki korzystasz, najprawdopodobniej posiada. Jaką bibliotekę wątków * używasz? –
@Shum: Gdy tylko powiesz "library", jedyną odpowiedzią jest "być może, zależy to od tego, jakie platformy obsługuje biblioteka i jaką funkcjonalność oferuje biblioteka". –
w przypadku C++, boost::thread::yield()
robi to, o co prosisz. Na platformach z gwintami posix, pthread_yield()
wykonuje tę samą funkcję dla C i cokolwiek, co łączy się z nią. Na platformach, na których to nie powoduje natychmiastowego zatrzymania wątku i rozpoczęcia kolejnego, dzieje się tak, ponieważ program planujący nie obsługuje tej funkcji. Nie sądzę, że wiele takich platform faktycznie istnieje na wolności.
Plonowanie nie musi zaczynać kolejnego wątku; program planujący może natychmiast wznowić wątek, który przyniósł. –
@ James: uzgodnione, niejednoznaczne sformułowania, ale rozważane z perspektywy harmonogramów krojonych w czasie, linia ta odzwierciedla, że każdy nowy wątek nadal czekałby na istniejący kawałek, zanim miałby jakąkolwiek szansę na zaplanowanie, zamiast komentowania, czy inny wątek naprawdę zajmij jego miejsce. –
W systemie Windows (który oczywiście nie ma wątków POSIX), jeden zasadniczo wywołuje funkcję "uśpienia" z limitem czasu wynoszącym 0, aby uzyskać wydajność. –
yield() to często zły projekt. Jeśli musisz poczekać na coś, poczekaj na to wyraźnie przez zdarzenie, sygnał lub jakiś stan. –
Należy zauważyć, że niemożliwe jest napisanie wersji "yield", która zawsze * przyniesie *. A co, jeśli nie ma innego wątku, który da * * *? Powiedziałbym, że SDL_Delay SDL (0) robi dokładnie to, co chcesz. –