2010-11-26 7 views
6

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++?

+5

yield() to często zły projekt. Jeśli musisz poczekać na coś, poczekaj na to wyraźnie przez zdarzenie, sygnał lub jakiś stan. –

+0

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. –

Odpowiedz

9

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.

+0

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

+0

@Shum: niezależnie od tego, z jakiej biblioteki korzystasz, najprawdopodobniej posiada. Jaką bibliotekę wątków * używasz? –

+0

@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". –

4

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.

+0

Plonowanie nie musi zaczynać kolejnego wątku; program planujący może natychmiast wznowić wątek, który przyniósł. –

+1

@ 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. –

+0

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ść. –