GNU/Linux >> Belajar Linux >  >> Linux

WaitForSingleObject dan WaitForMultipleObjects setara di Linux?

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.


Linux
  1. C ++ keamanan utas operator baru di linux dan gcc 4

  2. Bagaimana memberi nama utas di Linux?

  3. Linux setara dengan robocopy?

  1. Demystifying namespace dan container di Linux

  2. Linux – Sysfs dan Devtmpfs?

  3. Linux Hapus File dan Direktori

  1. Perintah Linux:pekerjaan, bg, dan fg

  2. Linux – Direktori Standar Dan/atau Umum Pada OS Unix/linux?

  3. penggunaan wildcard linux di cp dan mv