GNU/Linux >> Linux Esercitazione >  >> Linux

Implementazione delle variabili condizionali

A parte i controlli del valore restituito mancanti, ci sono altri problemi che dovrebbero essere risolti:

  • sem_destroy non è chiamato.
  • Segnale/trasmissione tocca il cond_node_t dopo aver riattivato il thread di destinazione, risultando potenzialmente in un use-after-free.

Ulteriori commenti:

  • L'operazione di distruzione omessa potrebbe richiedere modifiche alle altre operazioni, quindi è sicuro distruggere la variabile di condizione quando POSIX dice che sarà sicura. Non supportare destroy o imporre restrizioni più severe su quando può essere chiamato semplificherà le cose.
  • Un'implementazione di produzione gestirà l'annullamento del thread.
  • Esci da un'attesa (come richiesto per l'annullamento del thread e pthread_cond_timedwait timeout) può portare a complicazioni.
  • La tua implementazione mette in coda i thread in userland, cosa che viene eseguita in alcune implementazioni di produzione per motivi di prestazioni; Non capisco esattamente perché.
  • La tua implementazione accoda sempre i thread in ordine LIFO. Questo è spesso più veloce (ad esempio a causa degli effetti della cache) ma può portare alla fame. L'implementazione della produzione può talvolta utilizzare l'ordine FIFO per evitare la fame.

Fondamentalmente la tua strategia sembra ok, ma hai un grosso pericolo, un comportamento indefinito e una scelta pignola:

  • non stai ispezionando i valori di ritorno delle tue funzioni POSIX. In particolare sem_wait è interrompibile, quindi sotto carico pesante o sfortuna il tuo thread verrà svegliato in modo spurio. Dovresti catturare attentamente tutto ciò
  • nessuna delle tue funzioni restituisce un valore. Se qualche utente delle funzioni deciderà di utilizzare i valori restituiti un giorno, questo è un comportamento indefinito. Analizza attentamente i codici di errore che le funzioni di condizione possono restituire e fai proprio questo.
  • non lanciare il ritorno di malloc o calloc

Modifica: In realtà, non hai bisogno di malloc /free affatto. Va bene anche una variabile locale.


Linux
  1. Alcuni strumenti Zabbix

  2. Come ottenere un tipo di dati di variabili in Zsh?

  3. Funzioni nelle variabili Shell?

  4. Capire Linux Desktop?

  5. envsubst:comando non trovato

Come utilizzare le variabili in Ansible Playbook

Alcune buone alternative al comando

Variabili d'ambiente Linux

implementazione dell'operatore sizeof

Valore di ritorno di x =os.system(..)

Come attivare l'azione in condizioni di memoria insufficiente in Linux?