Tetap berpegang pada pthread_cond_timedwait
dan gunakan clock_gettime
. Misalnya:
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);
Bungkus dalam fungsi jika Anda mau.
PEMBARUAN:melengkapi jawaban berdasarkan komentar kami.
POSIX tidak memiliki API tunggal untuk menunggu "semua jenis" peristiwa/objek seperti yang dilakukan Windows. Masing-masing memiliki fungsinya sendiri. Cara termudah untuk memberi tahu utas untuk penghentian adalah menggunakan variabel/operasi atom. Misalnya:
Utas utama:
// 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);
Utas sekunder:
// 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
Alternatif lain adalah mengirimkan permintaan pembatalan menggunakan pthread_cancel
. Utas yang dibatalkan pasti bernama pthread_cleanup_push
untuk mendaftarkan penangan pembersihan yang diperlukan. Penangan ini dipanggil dalam urutan terbalik saat didaftarkan. Jangan pernah panggil pthread_exit
dari penangan pembersihan, karena itu perilaku yang tidak terdefinisi. Status keluar dari utas yang dibatalkan adalah PTHREAD_CANCELED
. Jika Anda memilih alternatif ini, saya sarankan Anda membaca terutama tentang poin dan jenis pembatalan.
Dan yang tak kalah pentingnya, memanggil pthread_join
akan membuat utas saat ini memblokir hingga utas yang diteruskan oleh argumen berakhir. Sebagai bonus, Anda akan mendapatkan status keluar dari utas.
Untuk apa nilainya, kami (NeoSmart Technologies) baru saja merilis pustaka open source (berlisensi MIT) yang disebut pevents yang mengimplementasikan manual WIN32 dan acara reset otomatis pada POSIX, dan menyertakan klon WaitForSingleObject dan WaitForMultipleObjects.
Meskipun secara pribadi saya menyarankan Anda untuk menggunakan paradigma multithreading dan pensinyalan POSIX saat membuat kode pada mesin POSIX, pevents memberi Anda pilihan lain jika Anda membutuhkannya.