GNU/Linux >> Belajar Linux >  >> Linux

Saya ingin menunggu deskriptor file dan mutex, apa cara yang disarankan untuk melakukan ini?

Setiap kali seseorang menggunakan arsitektur berbasis peristiwa, seseorang harus memiliki mekanisme tunggal untuk melaporkan penyelesaian acara. Di Linux, jika seseorang menggunakan file, seseorang diharuskan untuk menggunakan sesuatu dari keluarga pilih atau jajak pendapat yang berarti bahwa seseorang terjebak dengan menggunakan pipa untuk memulai semua peristiwa yang tidak terkait dengan file.

Edit :Linux memiliki eventfd dan timerfd. Ini dapat ditambahkan ke epoll Anda list dan digunakan untuk keluar dari epoll_wait baik saat dipicu dari utas lain atau pada peristiwa penghitung waktu masing-masing.

Ada opsi lain dan itu adalah sinyal. Seseorang dapat menggunakan fcntl memodifikasi deskriptor file sehingga sinyal dipancarkan saat deskriptor file menjadi aktif. Penangan sinyal kemudian dapat mendorong pesan siap file ke semua jenis antrean yang Anda pilih. Ini mungkin antrean semafor atau mutex/condvar sederhana. Karena seseorang sekarang tidak lagi menggunakan select /poll , seseorang tidak perlu lagi menggunakan pipa untuk tidak mengantri pesan berbasis file.

Peringatan kesehatan:Saya belum mencoba ini dan meskipun saya tidak dapat melihat mengapa ini tidak berhasil, saya tidak benar-benar mengetahui implikasi kinerja dari signal pendekatan.

Sunting:Memanipulasi mutex dalam penangan sinyal mungkin merupakan ide yang sangat buruk.


Saya telah memecahkan masalah ini dengan menggunakan apa yang Anda sebutkan, pipe() dan libevent (yang membungkus epoll). Thread pekerja menulis satu byte ke pipa FD-nya ketika antrian keluarannya berubah dari kosong menjadi tidak kosong. Itu membangunkan utas IO utama, yang kemudian dapat mengambil keluaran utas pekerja. Ini berfungsi dengan baik sebenarnya sangat mudah untuk dikodekan.


Anda memiliki tag Linux jadi saya akan membuang ini:Antrean Pesan POSIX melakukan semua ini, yang seharusnya memenuhi permintaan "bawaan" Anda jika bukan keinginan lintas platform yang kurang Anda inginkan.

Sinkronisasi thread-safe sudah terpasang. Anda dapat membuat utas pekerja Anda membaca antrean. Sebagai alternatif, MQ dapat menggunakan mq_notify() untuk menelurkan utas baru (atau menandai utas yang sudah ada) saat ada item baru yang dimasukkan ke dalam antrean. Dan karena sepertinya Anda akan menggunakan select(), pengidentifikasi MQ (mqd_t) dapat digunakan sebagai deskriptor file dengan pilih.


Linux
  1. Apa itu TAM dan mengapa Anda ingin menjadi TAM?

  2. Jangan pernah melakukan ini pada linux Anda rm -rf * / satu perintah untuk menghancurkan seluruh linux

  3. Mengapa File Descriptor Dibuka Dan Hanya Dibaca Sekali?

  1. Apa perbedaan antara mutex dan bagian kritis?

  2. Apa cara yang tepat untuk menggunakan inotify?

  3. Apa perbedaan mengarahkan output menggunakan >, &>, >&dan 2&>?

  1. Apa perbedaan antara menulis ke file dan memori yang dipetakan?

  2. Apa perbedaan antara `chattr +i FILE` dan` chmod -w FILE`?

  3. Apa perbedaan antara fsync dan syncfs?