Identyfikacja watkow

0

Mam aplikacje wielowatkowa. Potrzebna jest mi funkcja, ktora zwroci mi unikalny numer (identyfikator) watku, ktory ja wywolal. Identyfikator ten powinien byc >= 0 i mozliwie maly, tzn. ze jak mam 4 watki, to zeby mi nie zwracalo 65000. Dla tego samego watku nie musi byc zawsze ten sam identyfikator, jednak:

  • nie moze byc ten sam identyfikator dla 2 roznych watkow,
  • musi byc mozliwosc dowiedzenia sie zawczasu, np. przy tworzeniu watku, jakie beda jego identyfikatory (jesli mozliwe wiecej).

Wiem, ze cos takiego mozna zrealizowac za pomoca funkcji API syst. operacyjnego np. pthread_xxxx, ale to rozwiazanie ma jedna okropna wade: jest strasznie wolne. Potrzebne mi cos, co najlepiej da sie zrobic jako inline, czyli maks. kilkanascie opcodow. Mozliwe jest oczywiscie umieszczenie dowolnej ilosci kodu przy tworzeniu watkow / starcie aplikacji, ale pozniej juz watki musza byc identyfikowane bardzo szybko.

Drobna sugestia: mozna wykorzystac fakt, ze kazdy watek ma inny poczatek stosu. Z drugiej strony jednak wtedy strasznie cezko o przenosnosc - kazdy system, inaczej przydziela te adresy... :( Gorzej, nawet podwersje jadra Linuksa maja tu istotne znaczenie.

Moze macie jakies fajne pomysly, zarowno na "ujarzmienie stosu" jak i moze jakies zupelnie inne? Rozw. moze byc w asmie, ale wolalbym w C.

0

oblukaj funkcje tls*, lub zadeklaruj jakąś lokalną zmienną w wątku jako __declspec (thread) typ nazwa

tls = thread local storage

0

Dzieki, rzeczywiscie za pomoca tej funkcji da sie to zrobic, ale:

<font size="2"> CONFORMING TO set_thread_area is Linux specific and should not be used in programs that are intended to be portable. </span>

W miedzyczasie wymyslilem lepszy sposob (bardziej przenosny i prawdopodobnie szybszy, w kazdym razie wyst. szybki). Buduje sobie 2 poziomowa tablice cos w rodzaju 2 poziomowych tablic translacji stron wirtualnych w fizyczne, uzywanych w jadrach wielu systemow operacyjnych. Taka tablica ma pare fajnych cech:

  • Pozwala bardzo szybko zmapowac dowolny adres strony pamieci na cos innego (np. identyfikator o ktory mi chodzi) - dziala jak tablica asocjacyjna. Nie jest potrzebne zadne wyszukiwanie, liczenie funkcji haszujacej czy cos. Proste przesuniecia bitowe, dwa dodawania i wynik jest. Razem 2 linijki kodu w C!
  • Zajmuje malo pamieci. Kilkanascie kB na tablice 1. poziomu, po kilka kB na podtablice 2. poziomu w zaleznosci od tego ile stron jest uzywanych (to zalezy od liczby watkow).
  • Jest dosyc prosta w implementacji (kilkadziesiat linii w C).

Kiedy jest tworzony nowy watek, wszystkie strony jego stosu sa mapowane w jego identyfikator. Kiedy chce sie dowiedziec, jaki watek wywolal moja funkcje, wystarczy wziac ESP, przesunac o >>12 i mam numer strony. Z tablic mozna odczytac id dla tej strony np. tak:

tablica[adres >> 20][adres >> 12 & 0x000000FF].

1 użytkowników online, w tym zalogowanych: 0, gości: 1