2012-01-24 6 views
5

Podczas czytania wątku POSIX natknąłem się na przykład danych specyficznych dla wątku. Miałem jeden obszar zamieszania w moim umyśle ...Dane specyficzne dla wątków - dlaczego nie mogę po prostu użyć statycznej mapy z identyfikatorami wątków?

Interfejs gwint-specyficzne dane wygląda trochę niezgrabne, zwłaszcza gdy połączysz się konieczności korzystania pthread_once, różne inicjalizatory itd

Czy istnieje jakikolwiek powód, dla którego nie mogę po prostu użyć statycznego std :: map, gdzie klucz jest identyfikatorem pthread_self(), a wartość danych jest przechowywana w drugiej części std :: pair?

Nie mogę wymyślić przyczyny, która nie działałaby tak długo, jak długo byłaby owinięta w muteks, ale nie widzę żadnej sugestii ani niczego podobnego, co mnie myli, biorąc pod uwagę, że brzmi znacznie łatwiej niż podany interfejs API . Wiem, że wątki mogą mieć dużo catch-22, więc pomyślałem, że zapytam i zobaczę, czy mam wkroczyć ... coś nieprzyjemnego? :)

Odpowiedz

5

nie mogę wymyślić powodu, że to nie będzie pracować tak długo, jak to było zawinięte w mutex

To samo w sobie jest bardzo dobry powód; poprawnie zaimplementowane, można uzyskać dostęp do specyficznych dla wątków danych bez, uniemożliwiając innym wątkom jednoczesne tworzenie lub uzyskiwanie dostępu do ich wątków.

Istnieje również ogólna wydajność (stały dostęp czasowy, w porównaniu do czasu logarytmicznego, jeśli używasz std::map), nie ma gwarancji, że pthread_t ma odpowiednie porządkowanie zdefiniowane i automatyczne czyszczenie wraz ze wszystkimi innymi zasobami wątków.

Możesz użyć słowa kluczowego C++ 11 thread_local lub boost::thread_specific_ptr, jeśli nie podoba Ci się interfejs API Posix.

+0

+1, dziękuję za słowa kluczowe w C++ 11, z przyjemnością skorzystam z nich, gdy pojawi się projekt, który je obsługuje :) –

3
  1. wątek pthread-specyficzne dane istniały przed standardowych kontenerach biblioteki
  2. gwint-specyficzne dane unika się konieczności blokowania i sprawia, że ​​żadne inne mes wątek z danymi
  3. Dane oczyszczone automatycznie po zaniku nici

Powiedziawszy to, nic nie powstrzyma cię od skorzystania z własnego rozwiązania. Jeśli możesz być pewien, że kontener jest całkowicie skonstruowany przed uruchomieniem jakichkolwiek wątków (model statycznego wątkowania), nie potrzebujesz nawet muteksu.

+0

Co więcej, pthread jest C api, a nie C++ – nos