Itu pertanyaan lama, tapi tetap saja.
Utas POSIX di Linux di glibc (NPTL) diimplementasikan menggunakan dua sinyal waktu nyata. Mereka disembunyikan dari pengguna (dengan menyesuaikan konstanta angka min/maks). Semua kejadian di mana panggilan perpustakaan harus disebarkan ke semua utas (seperti setuid
) dilakukan melalui itu:memanggil utas mengirim sinyal ke semua utas untuk menerapkan perubahan, menunggu pengakuan dan melanjutkan.
I/O asinkron.
Sinyal waktu nyata adalah mekanisme kernel untuk memberi tahu sistem Anda ketika operasi I/O telah selesai.
struct aiocb
membuat koneksi antara permintaan I/O asinkron dan nomor sinyal.
Pertama-tama, perhatikan bahwa jawaban Ben benar. Sejauh yang saya tahu, seluruh tujuan sinyal waktu nyata di POSIX adalah sebagai mekanisme pengiriman waktu nyata untuk AIO, pemberitahuan antrean pesan, kedaluwarsa pengatur waktu, dan sinyal yang ditentukan aplikasi (baik internal maupun antar-proses).
Dengan demikian, sinyal secara umum adalah cara yang sangat buruk untuk melakukan sesuatu:
- Penangan sinyal bersifat asinkron, dan kecuali jika Anda memastikan bahwa mereka tidak mengganggu fungsi async-signal-unsafe, mereka hanya dapat menggunakan fungsi async-signal-safe, yang sangat membatasi apa yang dapat mereka lakukan.
- Pengendali sinyal adalah keadaan global. Pustaka tidak dapat menggunakan sinyal tanpa kontrak dengan program pemanggil terkait sinyal mana yang boleh digunakan, apakah diizinkan untuk membuatnya menginterupsi syscall, dll. Dan secara umum, status global hanyalah Hal Buruk .
- Jika Anda menggunakan
sigwait
(atau Linuxsignalfd
ekstensi) daripada penangan sinyal untuk memproses sinyal, mereka tidak lebih baik dari mekanisme IPC/notifikasi lainnya, dan masih berpotensi lebih buruk.
IO asinkron jauh lebih baik dicapai dengan mengabaikan API POSIX AIO yang dirancang dengan buruk dan hanya membuat utas untuk melakukan IO pemblokiran normal dan memanggil pthread_cond_signal
atau sem_post
ketika operasi selesai. Atau, jika Anda mampu membayar sedikit biaya kinerja, Anda bahkan dapat meneruskan kembali data yang baru dibaca ke diri Anda sendiri melalui pipa atau pasangan soket, dan meminta proses utas utama membaca file biasa secara asinkron dengan select
atau poll
seperti yang Anda lakukan pada soket/pipa/ttys.