OS to Linux działający z pthreadspthreads, skąd mam wiedzieć, że inny wątek w procesie nie czeka?
Mam dwa wątki robocze, które działają wiecznie, dopóki zmienna stop nie przyjmie wartości true, a wątki zakończą się z gracją. Zamiast wykonywania oczekującego połączenia oba wątki wywołują pthread_cond_wait, dopóki sygnał nie powiadomi o nowym zadaniu. System działa dobrze.
Należy utworzyć wątek "info", który wyświetli niektóre informacje dotyczące debugowania. Wątek informacyjny będzie próbował czytać i drukować informacje co 30 sekund. Część tych informacji, chciałbym być STANEM każdego wątku roboczego. Czy można znaleźć, czy wątek jest zablokowany w "pthread_cond_wait"? Jeśli wątek czeka jest pthread_cond_wait to STAN == czekanie w dalszym ciągu na stan STATE ==.
while ((sharedvaluffer == 0) && (doneflag == 0)) {
pthread_cond_wait (&taks_added, &buffer);
}
Oczywiście możemy zrobić, że więcej kodu. Do powyższego fragmentu możemy dodać zmienną globalną, która oznacza, że wątek jest zablokowany. Kod można wykonać:
while ((sharedvaluffer == 0) && (doneflag == 0)) {
lock;
i_am_waiting = truel
unlock
pthread_cond_wait (&taks_added, &buffer);
}
Pytanie brzmi, czy istnieje łatwiejszy sposób na bardziej skalowalny. Stos wątku oczekujących jest
Thread 6 (Thread 0x40800940 (LWP 20732)):
#0 0x00002ba4567a9326 in [email protected]@GLIBC_2.3.2()
#1 0x00000000007ce2ed in worker(void*)()
#2 0x00002ba4567a5193 in start_thread() from /lib64/libpthread.so.0
#3 0x00002ba458a82f0d in clone() from /lib64/libc.so.6
która nie działa, jeśli pracownik blokuje niektóre muteksy (tj. W przypadku wspólnej muteks) – cateof
Dlaczego nie? Każdy wątek ma swój własny identyfikator. Zachowaj dostępny 'pthread_t current_owner' i aktualizuj go za każdym razem, gdy wątek roboczy nabywa muteks. Twój wątek informacyjny porównuje tę zmienną z identyfikatorem każdego wątku roboczego. Pamiętaj, że pthread_t jest 'int' na Linuksie, ale ogólnie jest strukturą w innych systemach, więc nie możesz polegać na atomowości, wymagającej dodatkowej blokady. – jweyrich