Lo scenario corrente è epoll_wait su un paio di fds e una coda di possibili messaggi in arrivo, vorrei che il ciclo sotto epoll_wait fosse eseguito su evento IO o su nuovo messaggio.
Ways so:Interrompere epoll_wait con un evento non-IO, nessun segnale
- Utilizzare un timeout msec
time
e controllare la coda prima cosa al ciclo - Utilizzare il self-pipe trick dal codice della coda quando i messaggi saranno disponibili
- Interrompere lo syscall con un segnale standard
- Usa epoll_pwait e perfezionare al punto precedente
Nessuno dei punti postato sopra soddisfare me enoug e mi stavo chiedendo se ci sono altri metodi che non ho trovato.
Le ragioni sono:
- segnali sono qualcosa da evitare sul codice multi-threaded e non sono molto affidabili
- Timeout uno rimuove parte del beneficio della epoll, solo svegliarsi con eventi
- Self-pipe sguardi trucco l'approccio migliore per il momento, ma ancora troppo foglio di accensione
idee?
Ho usato eventfd con successo quando solo un thread è in attesa di un epollfd, ma che dire di più thread stanno aspettando lo * stesso * epollfd? è utile anche in questo caso? se é cosi, come? –