Il modo "giusto" di codificare un produttore/consumatore è di aspettare che il consumatore i dati del produttore. È possibile ottenere ciò utilizzando un oggetto di sincronizzazione come un Mutex. Il consumatore sarà Wait
sul mutex, che lo bloccherà dall'esecuzione finché i dati non saranno disponibili. A sua volta, il produttore segnalerà il mutex quando i dati sono disponibili, il che riattiva il thread del consumatore in modo che possa iniziare l'elaborazione. Questo è più efficiente rispetto sleep
sia in termini di:
- utilizzo della CPU (nessun cicli si sprecano), e
- tempo di esecuzione (esecuzione inizia non appena sono disponibili i dati, non quando un thread è in programma a svegliarsi su).
Detto questo, ecco un'analisi del rendimento rispetto al sonno che hai richiesto. Potrebbe essere necessario utilizzare tale schema se per qualche motivo attendere l'output non è fattibile:
Dipende da quanto traffico si sta ricevendo - se i dati vengono costantemente ricevuti ed elaborati, si potrebbe considerare di fare un rendimento. Tuttavia nella maggior parte dei casi ciò si tradurrà in un ciclo "occupato" che trascorre la maggior parte del tempo svegliando inutilmente il thread per verificare se qualcosa è pronto.
Probabilmente vorrai dormire per un breve periodo di tempo (forse per meno di un secondo, usando usleep
) O meglio ancora usare un oggetto di sincronizzazione come un mutex per segnalare che i dati sono disponibili.
fonte
2010-04-19 15:19:48
Né si desidera bloccare. Google "buffer limitato". –