GNU/Linux >> Znalost Linux >  >> Linux

Implementace podmínkových proměnných

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 nebo calloc

Upravit: Ve skutečnosti nepotřebujete malloc /free vůbec. Místní proměnná by také fungovala.


Linux
  1. C Výukový program programování Část 5 - Znakové proměnné

  2. $bashpid a $$ se v některých případech liší?

  3. Expanze závorky Bash a proměnné?

  1. Jak získat datový typ proměnných v Zsh?

  2. Funkce v proměnných Shell?

  3. Rozumíte Linux Desktopu?

  1. envsubst:příkaz nenalezen

  2. Co vrátí malloc(0)?

  3. pthread_exit vs. návrat