Ho un sistema di flusso di dati asincrono scritto in C++. Nell'architettura del flusso di dati, l'applicazione è un insieme di istanze del componente, che vengono inizializzate all'avvio, quindi si comunicano reciprocamente con messaggi predefiniti. Esiste un tipo di componente denominato Pulsar, che fornisce un "segnale di segnale di clock" ad altri componenti che si collegano ad uno di essi (ad es. Delay). Emette un messaggio (chiama l'API del dispatcher del flusso di dati) ogni X ms, dove X è il valore del parametro "frequenza", che è indicato in ms.Qual è il modo ufficiale per chiamare una funzione (C/C++) in ab. ogni 1/100 sec su Linux?
Breve, l'operazione è solo per chiamare una funzione (metodo) in ogni X ms. La domanda è: qual è il modo migliore/ufficiale per farlo? C'è qualche schema per questo?
ci sono alcuni metodi che ho trovato:
- Usa SIGALRM. Penso che la segnalazione non sia adatta a questo scopo. Anche se la risoluzione è 1 secondo, è troppo raro.
- Utilizzare l'interruzione HW. Non ho bisogno di questa precisione. Inoltre, sono a conoscenza dell'utilizzo di una soluzione correlata a HW (il server è compilato per diverse piattaforme, ad esempio ARM).
- Misurare il tempo trascorso e dormire() fino alla prossima chiamata. Non sono sicuro che sia il modo migliore per misurare il tempo per chiamare le chiamate di sistema relative al tempo di 5 thread, ogni 10 volte al secondo - ma forse ho torto.
- Utilizzare le funzioni del kernel RealTime. Non ne so nulla. Inoltre, non ho bisogno di una chiamata precisa di cristallo, non è un atomreactor e non posso installare il kernel RT su alcune piattaforme (anche il kernel 2.6.x è disponibile).
Forse, la risposta migliore è una breve parte commentata del codice sorgente di un lettore audio/video (che non riesco a trovare/comprendere da solo).
UPDATE (richiesto da @MSalters): il co-autore del progetto DF utilizza Mac OSX, quindi dovremmo trovare una soluzione che funzioni sulla maggior parte di Posix-compilant op. sistemi, non solo su Linux. Forse, in futuro ci sarà un dispositivo di destinazione che usa BSD, o qualche Linux limitato.
Un segnale è appropriato nonostante le tue prenotazioni. Controlla 'man setitimer', provaci e facci sapere se hai problemi reali. Se stai già bloccando qualcosa come select(), puoi usare invece un valore di timeout. –
Segnala una buona scelta per un'app multithread? Quando arriva un segnale, dovrebbe essere "inviato" al thread appropriato. – ern0
Le maschere di segnale sono per-thread, quindi puoi bloccare 'SIGALRM' in ogni altro thread. – caf