GNU/Linux >> Belajar Linux >  >> Linux

Implementasi variabel kondisi

Selain pemeriksaan nilai pengembalian yang hilang, ada beberapa masalah lain yang harus diperbaiki:

  • sem_destroy tidak dipanggil.
  • Sinyal/siaran sentuh cond_node_t setelah membangunkan utas target, berpotensi menghasilkan penggunaan setelah bebas.

Komentar lebih lanjut:

  • Operasi penghancuran yang dihilangkan mungkin memerlukan perubahan pada operasi lain sehingga aman untuk menghancurkan variabel kondisi ketika POSIX mengatakan itu akan aman. Tidak mendukung penghancuran atau memberlakukan batasan yang lebih kuat pada saat itu dapat dipanggil akan menyederhanakan banyak hal.
  • Implementasi produksi akan menangani pembatalan utas.
  • Mundur dari penantian (seperti yang diperlukan untuk pembatalan utas dan pthread_cond_timedwait waktu tunggu) dapat menyebabkan komplikasi.
  • Implementasi Anda mengantri di userland, yang dilakukan di beberapa implementasi produksi karena alasan kinerja; Saya tidak mengerti persis mengapa.
  • Implementasi Anda selalu mengantrekan utas dalam urutan LIFO. Ini seringkali lebih cepat (seperti karena efek cache) tetapi dapat menyebabkan kelaparan. Implementasi produksi kadang-kadang dapat menggunakan pesanan FIFO untuk menghindari kelaparan.

Pada dasarnya strategi Anda terlihat baik-baik saja, tetapi Anda memiliki satu bahaya besar, beberapa perilaku yang tidak terdefinisi, dan pilihan yang sulit:

  • Anda tidak memeriksa nilai kembalian dari fungsi POSIX Anda. Khususnya sem_wait dapat diinterupsi sehingga di bawah beban berat atau nasib buruk, utas Anda akan terbangun secara palsu. Anda harus hati-hati menangkap semua itu
  • tidak ada fungsi Anda yang mengembalikan nilai. Jika beberapa pengguna fungsi akan memutuskan untuk menggunakan nilai yang dikembalikan suatu hari nanti, ini adalah perilaku yang tidak terdefinisi. Analisis dengan cermat kode kesalahan yang diizinkan untuk dikembalikan oleh fungsi kondisi dan lakukan hal itu.
  • jangan mengembalikan malloc atau calloc

Edit: Sebenarnya, Anda tidak memerlukan malloc /free sama sekali. Variabel lokal juga bisa.


Linux
  1. envsubst:perintah tidak ditemukan

  2. Memeriksa variabel lingkungan

  3. pthread_exit vs. kembali

  1. Tutorial Pemrograman C Bagian 5 - Variabel karakter

  2. Beberapa alat Zabbix

  3. Bagaimana cara memicu tindakan pada kondisi memori rendah di Linux?

  1. Apa yang dikembalikan malloc(0)?

  2. Implementasi beberapa pipa di C

  3. implementasi sizeof operator