Jest to nieco surowy, ale już teraz nadal działa zgodnie z moimi wymaganiami. :) Używam boost 153 i qt. Stworzyłem wektor int do śledzenia "statusu" moich wątków. Za każdym razem, gdy utworzę nowy wątek, dodaję jeden wpis do wątku thread_ids z wartością 0. Dla każdego utworzonego wątku przekazuję identyfikator, dzięki czemu wiem, jaką część wątków thread_ids mam aktualizować. Ustaw status na 1 dla bieżących i innych wartości w zależności od aktualnie wykonywanej aktywności, więc wiem, jakie czynności zostały wykonane po zakończeniu wątku. 100 to wartość ustawiona dla poprawnie ukończonego wątku. Nie jestem pewien, czy to pomoże, ale jeśli masz inne sugestie, jak to poprawić, daj mi znać. :)
std::vector<int> thread_ids;
const int max_threads = 4;
void Thread01(int n, int n2)
{
thread_ids.at(n) = 1;
boost::this_thread::sleep(boost::posix_time::milliseconds(n2 * 1000));
thread_ids.at(n) = 100;
qDebug()<<"Done "<<n;
}
void getThreadsStatus()
{
qDebug()<<"status:";
for(int i = 0; i < max_threads, i < thread_ids.size(); i++)
{
qDebug()<<thread_ids.at(i);
}
}
int main(int argc, char *argv[])
{
for(int i = 0; i < max_threads; i++)
{
thread_ids.push_back(0);
threadpool.create_thread(
boost::bind(&boost::asio::io_service::run, &ioService));
ioService.post(boost::bind(Thread01, i, i + 2));
getThreadsStatus();
}
ioService.stop();
threadpool.join_all();
getThreadsStatus();
}
To trochę mylące stwierdzenie, że może to doprowadzić do stanu wyścigowego. Sam 'timed_join' nie może tego zrobić. jeśli popełnisz jakieś błędne założenia w oparciu o wynik połączenia, możesz oczywiście skończyć z warunkiem wyścigu, ale to nie ma nic wspólnego z 'timed_join' niż z tobą, zakładając, że wynik tego połączenia jest nadal ważny. W każdym razie +1 – jalf
Myślę, że to jest naprawdę złe. Dlaczego projektanci wspomagania nigdy nie myślą o intuicji ani o początkujących. Wystarczyłaby prosta metoda isRunning(). Zamiast tego zmuszają one do używania funkcji, która nie powinna być intuicyjnie użyta w tym przypadku. Nie chcę próbować dołączać do wątku, chcę tylko szybko sprawdzić, czy nadal coś robi. To jest bzdura. Zmarnowałem dużo czasu, zanim to znalazłem. To nie jest cholerne słowo w "docs". – AndreasT
Wątek może być w 3 stanach: Bieganie, Wolnostojący, Notowanie. –