Desidero implementare un modo per pianificare un'attività da eseguire in un secondo momento. L'interfaccia sarebbe simile a JavaScript setTimeout(function, milliseconds)
.Attività ritardate C++
Nella mia applicazione alcune risorse sono di proprietà di una discussione. Per evitare condizioni di gara, è sempre necessario accedervi dallo stesso thread. Se altri thread vogliono accedere alla risorsa, devono inviare un oggetto task al thread di risorse.
Così due problemi che devo risolvere sono:
- inviare un compito ad un filo
- ritardo l'invocazione
Il primo problema è risolto rapidamente utilizzando una coda senza blocchi che ha il filo della risorsa dal lato dei consumatori. (Io uso TBB's concurrent_bounded_queue.) Il secondo problema, tuttavia, non è così ovvio per me. Posso pensare a due strategie:
- Avviare un nuovo thread per ogni attività. Questo thread interromperà il ritardo richiesto, quindi invierà l'attività alla coda concorrente.
- Avvia solo un thread che esegue un ciclo che itera le attività pianificate e li richiama se il loro tempo di attesa è scaduto.
Ho sperimentato con entrambi gli approcci e tendo a preferire il primo perché è semplice e affidabile, mentre il secondo tende ad essere più incline a bug sottili. Il primo approccio lo delega allo scheduler dei thread del sistema operativo.
Tuttavia, la prima soluzione crea molti thread di breve durata, mentre di solito ascolto la raccomandazione di riutilizzare i thread.
non vi è alcuna garanzia nel secondo approccio di esecuzione tempestiva. a volte è necessario attendere il completamento di un'attività prima di eseguire la seconda. Il primo approccio è migliore. –
Il numero di thread generato sarà davvero così tanto? Come poche centinaia di migliaia? Ricorda che i thread dormono consumano abbastanza vicino a 0 tempo di CPU. –
@BartekBanachewicz Nella mia applicazione non ci saranno molte attività pianificate contemporaneamente. Di solito eseguono un'azione ogni N millisecondi. Lo fanno riprogrammando se stessi prima di morire. – StackedCrooked