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
ocalloc
Modifica: In realtà, non hai bisogno di malloc
/free
affatto. Va bene anche una variabile locale.