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ść. –
- 1. Wieloplatformowy sposób uzyskiwania katalogu tymczasowego w języku Python
- 2. Wieloplatformowy sposób na wykorzystanie procesora/pamięci
- 3. Dropzone wieloplatformowy generowanie miniatur
- 4. Programowy sposób uzyskiwania słów kluczowych w Ruby
- 5. w jaki sposób uczynić pip zgodnym ze zmienną środowiskową "CC"
- 6. Uniwersalny, wieloplatformowy (mobilny) sposób wyświetlania ostrzeżeń dla użytkownika
- 7. Szybki sposób uzyskiwania wymiarów obrazu (bez formatowania)
- 8. Jaki jest prawidłowy sposób uzyskiwania ze strumienia?
- 9. Jak poprawnie skonfigurować wieloplatformowy projekt Delphi XE2?
- 10. Sposób deklarowania wątku lokalnego statycznego w szablonie
- 11. Jaki jest najlepszy sposób uzyskiwania/używania kontekstu w AsyncTask?
- 12. Sposób uzyskiwania i edytowania zmiennych GET w celu tworzenia hiperłączy
- 13. Sposób uzyskiwania dostępu do plików zasobów w pythonie
- 14. mailto z wieloma adresami cc
- 15. Co oznacza CC? = W pliku Makefile?
- 16. jest + = w wątku wątku bezpieczne?
- 17. Najlepsza praktyka uzyskiwania EntityManagerFactory
- 18. planowanie wątku po wątku w aplikacji iPhone
- 19. sposób uzyskiwania dostępu do IFA z przeglądarki na iOS6
- 20. sposób uzyskiwania dostępu do podstawowej domyślnej kolejki współbieżnej kolekcji blokującej
- 21. Właściwy sposób uzyskiwania danych z bazy danych Access
- 22. Google Street View: Alternatywny sposób uzyskiwania danych z widoku ulicy
- 23. Czy istnieje międzyplatformowy sposób uzyskiwania informacji z Python OSError?
- 24. sposób uzyskiwania dostępu do strony wzorcowej ze strony zawartości
- 25. Najlepszy sposób uzyskiwania dostępu do obiektów COM z C#
- 26. wyślij e-mail do BCC i CC w Django
- 27. Różnica między CC, gcc i g ++?
- 28. uzyskiwania dostępu zagnieżdżone słownika przedmioty w Pythonie
- 29. Zapisywanie do pliku w sposób bezpieczny dla wątku
- 30. w jaki sposób osiągnąć wielowątkowość za pomocą jednego wątku?
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. –