Bleiben Sie bei pthread_cond_timedwait
und verwenden Sie clock_gettime
. Zum Beispiel:
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);
Wickeln Sie es in eine Funktion ein, wenn Sie möchten.
UPDATE:Ergänzung der Antwort basierend auf unseren Kommentaren.
POSIX hat keine einzige API, um auf "alle Arten" von Ereignissen/Objekten zu warten, wie es Windows tut. Jeder hat seine eigenen Funktionen. Der einfachste Weg, einen Thread für die Beendigung zu benachrichtigen, ist die Verwendung von atomaren Variablen/Operationen. Zum Beispiel:
Hauptthread:
// 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ärer Thread:
// 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
Eine weitere Alternative ist das Senden einer Stornierungsanfrage mit pthread_cancel
. Der abzubrechende Thread muss pthread_cleanup_push
aufgerufen haben um alle erforderlichen Bereinigungshandler zu registrieren. Diese Handler werden in der umgekehrten Reihenfolge aufgerufen, in der sie registriert wurden. Rufen Sie niemals pthread_exit
an von einem Cleanup-Handler, da es sich um ein undefiniertes Verhalten handelt. Der Beendigungsstatus eines abgebrochenen Threads ist PTHREAD_CANCELED
. Wenn Sie sich für diese Alternative entscheiden, empfehle ich Ihnen, sich hauptsächlich über Kündigungspunkte und -arten zu informieren.
Und zu guter Letzt rufen Sie pthread_join
an wird den aktuellen Thread blockieren, bis der als Argument übergebene Thread beendet wird. Als Bonus erhalten Sie den Beendigungsstatus des Threads.
Für das, was es wert ist, haben wir (NeoSmart Technologies) gerade eine Open-Source-Bibliothek (MIT-lizenziert) namens pevents veröffentlicht, die manuelle und automatische Reset-Ereignisse von WIN32 auf POSIX implementiert und sowohl WaitForSingleObject- als auch WaitForMultipleObjects-Klone enthält.
Obwohl ich Ihnen persönlich raten würde, POSIX-Multithreading und Signalisierungsparadigmen zu verwenden, wenn Sie auf POSIX-Rechnern programmieren, gibt Ihnen pevents eine andere Wahl, wenn Sie sie brauchen.