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
ataucalloc
Edit: Sebenarnya, Anda tidak memerlukan malloc
/free
sama sekali. Variabel lokal juga bisa.
Bagaimana cara menghapus semua file dalam folder, tetapi tidak menghapus folder menggunakan pustaka standar NIX?
Mengapa tidak ada API DirectX untuk Linux?