Kromě chybějících kontrol návratové hodnoty existují některé další problémy, které by měly být opravitelné:
sem_destroy
se nevolá.- Signál/vysílání se dotkněte
cond_node_t
po probuzení cílového vlákna, což může mít za následek použití-po-free.
Další komentáře:
- Vynechaná operace zničení může vyžadovat změny ostatních operací, takže je bezpečné zničit proměnnou podmínky, když POSIX říká, že to bude bezpečné. Nepodporovat zničit nebo uvalit přísnější omezení na to, kdy může být voláno, věci zjednoduší.
- Produkční implementace by zvládla zrušení vlákna.
- Ustoupení od čekání (požadované například pro zrušení vlákna a
pthread_cond_timedwait
timeouty) může vést ke komplikacím. - Vaše implementace zařazuje vlákna do fronty v uživatelské zemi, což se v některých produkčních implementacích děje z důvodu výkonu; Nechápu přesně proč.
- Vaše implementace vždy řadí vlákna do fronty v pořadí LIFO. To je často rychlejší (například kvůli efektům mezipaměti), ale může to vést k hladovění. Implementace výroby může někdy použít objednávku FIFO, aby se zabránilo hladovění.
V zásadě vaše strategie vypadá dobře, ale máte jedno velké nebezpečí, nějaké nedefinované chování a hnidopich:
- nekontrolujete návratové hodnoty vašich funkcí POSIX. Konkrétně
sem_wait
je přerušitelný, takže při velkém zatížení nebo smůle se vaše vlákno falešně probudí. To vše byste museli pečlivě chytit - žádná z vašich funkcí nevrací hodnotu. Pokud se některý uživatel funkcí rozhodne někdy použít návratové hodnoty, jedná se o nedefinované chování. Pečlivě analyzujte chybové kódy, které mohou funkce podmínek vracet, a udělejte to.
- nepřenášejte návratovou hodnotu
malloc
nebocalloc
Upravit: Ve skutečnosti nepotřebujete malloc
/free
vůbec. Místní proměnná by také fungovala.
Jak odstranit všechny soubory ve složce, ale nesmazat složku pomocí standardních knihoven NIX?
Proč neexistuje rozhraní DirectX API pro Linux?