Domanda

Al momento sto utilizzando un modello di consumo produttore per la parte rendering di un'applicazione grafica in tempo reale. Il consumatore continuamente cercare i dati in nostro coda (loop infinito); tuttavia Ho paura che questo può causare la mia simulazione per ottenere fuori sincrono del ciclo principale. Credo che questo sia il produttore veloce lento problema dei consumatori -. Aggravato dal fatto che la simulazione è trattenuto per un certo periodo di tempo

Domanda - che cosa è il metodo migliore per mantenere tutto questo in equilibrio e assicurarsi che il consumatore ha abbastanza tempo per finire, ma anche che la simulazione non si muove al fotogramma successivo prima stiamo termine del rendering nostro frame corrente (o almeno essere in grado di rilevare questo e saltare rendendo il fotogramma successivo - o interrompere il frame corrente viene reso) sono attualmente appena interrotto e la giunzione dopo ogni consumatore è finito

Seconda domanda: se si guarda il codice qui sotto vedrete che attualmente sto solo chiamando interrupt e unisciti dopo l'aggiunta di posti di lavoro di rendering alla coda - questo permette al filo per tutto il tempo di cui ha bisogno per completare il suo funzionamento, e di rispondere alla interrupt quando finito. Come posso riutilizzare le discussioni in un pool di thread dopo interrupt_all e join_all sono chiamati? (Cioè se chiamo drawNextFrame nuovo)

Il produttore fa parte del thread principale di esecuzione (non credo che questo influisce nulla)

pseudo code:

void renderSystem::init()
create queue to hold work;
create consumer threads of type RenderConsumer set to watch our queue; 
add threads to thread_pool of consumers called 'RenderThreads'

void renderSystem::drawNextFrame()
for each thread in 'RenderThreads' divy up work; 
add work assignment to queue;
    //RenderThreads will now successfully start pulling data from our queue
renderThreads.interupt_all();
renderThreads.join_all();

int main()
renderer = renderSystem class;
renderer.init()
while(not_gameover)
    renderer.drawNextFrame();
    doOtherCoolStuff();
    profit(?)
return(0)

se avete bisogno di guardare la classe di consumatori vedere di seguito:

pseudo code:

RenderConsumer::operator () ()
    while(true)
        try to dequeue from queue
        //digest any packet we get
        for each ( pixel in packet )
            computePrettyStuff()
        //we are now done with packet that we got
        this_thread::interruption_point();

Ho provato a fare questo semplice e veloce da digerire, grazie per il vostro tempo

È stato utile?

Soluzione

1 #. Vorrei farlo contando l'importo in coda dopo ogni rendering. Se è troppo alto, allora o

a. Dump la coda

b. Impostare una variabile booleana false Tale variabile sarà condiviso tra i fili, e quando il produttore vede che è falso, inizia in attesa di una variabile di condizione. Il consumatore notifica quindi il produttore quando la coda è giù ad un livello accettabile di nuovo.

2 #. Probabilmente non è possibile con join_all, come la postcondizione per join_all è

  

Ogni discussione nel gruppo ha   terminato.

secondo l'riferimento.

Potrebbe tuttavia essere possibile, utilizzando barriere invece di join_all, ma poi si dovrà trovare un modo per fornire loro i dati, che sarebbero immancabilmente finire che necessitano di alcune variabili più condivise.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top