Łatwym rozwiązaniem jest posiadanie zmiennej boolowskiej, którą wątek ustawia na true w regularnych odstępach czasu, a która jest sprawdzana i ustawiana na false przez wątek, który chce znać status. Jeśli zmienna jest zbyt długa, to wątek nie jest już uważany za aktywny.
Bardziej bezpiecznym sposobem na wątki jest posiadanie licznika, który jest zwiększany przez wątek podrzędny, a wątek główny porównuje licznik z przechowywaną wartością, a jeśli to samo po zbyt długim czasie, wątek podrzędny jest uważany za nieaktywny.
Zauważ jednak, że w C ++ 11 nie ma sposobu, aby faktycznie zabić lub usunąć wątek, który się zawiesił.
Edytuj Jak sprawdzić, czy wątek został czysty, czy nie: Zasadniczo ta sama technika, co opisana w pierwszym akapicie; Miej zmienną logiczną zainicjowaną jako false. Ostatnią rzeczą, jaką robi wątek potomny, jest ustawienie wartości true. Wątek główny może następnie sprawdzić tę zmienną, a jeśli to prawda, wykonać złączenie w wątku potomnym bez większego (jeśli w ogóle) blokowania.
Edit2 Jeśli wątek kończy pracę z powodu wyjątku, mają dwie "główne" funkcje wątku: Pierwsza z nich ma try
- catch
wewnątrz której wywołuje drugą "prawdziwą" funkcję głównego wątku. Ta pierwsza główna funkcja ustawia zmienną „have_exited”. Coś takiego:
bool thread_done = false;
void *thread_function(void *arg)
{
void *res = nullptr;
try
{
res = real_thread_function(arg);
}
catch (...)
{
}
thread_done = true;
return res;
}
wait()
, a jeśli tak, jeśli jeszcze tego nie zrobiłeśwait()
, z definicji musi działać. Ale to rozumowanie może być niedokładne.