2010-05-16 11 views
9

Sto considerando di usare i thread C++ 0x nella mia applicazione invece dei thread Boost. Tuttavia, non sono sicuro di come reimplementare ciò che ho con thread standard di C++ 0x dal momento che non sembrano avere un metodo interrupt().Come interrompere un thread C++ 0x in attesa?

La mia messa a punto corrente è:

  • un filo master che gestisce il lavoro;
  • diversi thread di lavoro che eseguono i comandi del master.

I lavoratori chiamano wait() su almeno due diverse variabili di condizione. Il Maestro ha uno stato "scaduto": in questo caso dice a tutti i lavoratori di fermarsi e dare qualsiasi risultato abbiano ottenuto. Con il master Boost Thread utilizza solo interrupt_all() in un gruppo di thread, il che fa sì che i lavoratori smettano di aspettare. Nel caso in cui non stiano aspettando al momento, il master imposta anche un flag bool che i lavoratori controllano periodicamente.

Tuttavia, in C++ 0x std::thread non vedo alcuna sostituzione per interrupt(). Mi manca qualcosa? In caso contrario, come posso attuare lo schema di cui sopra in modo che i lavoratori non possano semplicemente dormire per sempre?

risposta

9

Purtroppo non vedo un altro modo di eseguire il polling, invece di utilizzare wait utilizzare un'attesa programmata e una variabile per indicare che l'interruzione è stata eseguita.

void th(Interruptor& interruptor) { 
    try { 

    ... 

    while (cnd1.timed_wait(d)==false) { 
     interruptor.check_interruption_point(); 
    } 
    ... 
    } catch (interrupted_exception &) {} 
} 

La classe Interruttore manterrà una variabile booleana protetto con un mutex o utilizzando operazioni atomiche se li avete e due funzioni di interrupt e check_interruption_point, che con gettare un interrupted_exception se il booleano è vero. Il thread Mater creerà una variabile Interruptor che verrà assegnata ai thread interessati al momento della creazione. Il master ha la possibilità di interrompere immediatamente tutti i thread che dipendono da questo interrutore. Ovviamente è possibile creare un interrupt per ogni thread se si desidera interrompere esplicitamente un thread alla volta.

Fino a voi per definire la durata sull'attesa a tempo, in modo che i thread siano in grado di reagire non appena richiesto dal programma.

+0

Penso che continuerò a utilizzare i thread Boost. Sono anche buggy, ma almeno ho un workaround stabile per loro. – doublep

1

Wait boost fa sull'interrupt() è di emettere un notify_all sulla condizione che un thread è attualmente bloccato e quindi controllare se è stata richiesta un'interruzione. Se è stata richiesta un'interruzione, viene eseguito un boost: thread_interrupted. È possibile scrivere una propria classe thread basata su std :: thread con il meccanismo.

+2

E presumibilmente scrivere la sottoclasse della mia condizione in modo che il thread sappia cosa aspetta? Sembra un po 'troppo lavoro per me. – doublep

1

Infatti, C++ 11 std :: thread non offre un meccanismo standard per questo (ancora?). Quindi, secondo la decisione di @ doublep di utilizzare boost :: thread per il momento.

Preferiremmo usare C++ 11 std :: facilities. Ma non vogliamo ricostruire l'impianto di boost terminate(), completo di variabile di condizione futzing per interrompere il sonno ecc., Senza motivo. Creare un'infrastruttura del genere è divertente, e non così difficile, ma improduttivo e meno standard rispetto all'utilizzo di boost.

È utile che boost :: thread e std :: thread siano così simili che ci sembra di non dipingere noi stessi in un angolo. (Ci aspettiamo che l'eventuale migrazione a std :: thread sia relativamente semplice, forse anche banale.)

Problemi correlati