Držte se pthread_cond_timedwait
a použijte clock_gettime
. Například:
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
ret = pthread_cond_timedwait(&cond, &mutex, &ts);
Pokud si přejete, zabalte jej do funkce.
AKTUALIZACE:doplnění odpovědi na základě našich komentářů.
POSIX nemá jediné API, které by čekalo na „všechny typy“ událostí/objektů jako Windows. Každý z nich má své vlastní funkce. Nejjednodušším způsobem, jak upozornit vlákno na ukončení, je použití atomických proměnných/operací. Například:
Hlavní vlákno:
// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);
// "Signal" termination by changing the initial value
atomic_inc(&must_terminate);
Sekundární vlákno:
// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
// Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status
Další alternativou je odeslat žádost o zrušení pomocí pthread_cancel
. Vlákno, které se ruší, musí mít volání pthread_cleanup_push
registrovat všechny potřebné nástroje pro čištění. Tyto obslužné rutiny jsou vyvolány v opačném pořadí, v jakém byly zaregistrovány. Nikdy nevolejte pthread_exit
z obslužné rutiny čištění, protože jde o nedefinované chování. Stav ukončení zrušeného vlákna je PTHREAD_CANCELED
. Pokud se rozhodnete pro tuto alternativu, doporučuji si přečíst hlavně o storno bodech a typech.
A v neposlední řadě volání pthread_join
vytvoří blok aktuálního vlákna, dokud vlákno předané argumentem neskončí. Jako bonus získáte stav ukončení vlákna.
Co to stojí za to, my (NeoSmart Technologies) jsme právě vydali open source (MIT licencovanou) knihovnu nazvanou pevents, která implementuje WIN32 ruční a automatické resetování událostí na POSIX a zahrnuje klony WaitForSingleObject a WaitForMultipleObjects.
I když bych vám osobně doporučil používat POSIX multithreading a signalizační paradigmata při kódování na POSIX strojích, pevents vám dává jinou možnost, pokud ji potřebujete.