Esecuzione di un'attività periodica con std :: async

0

Sto scrivendo una classe che periodicamente deve controllare, se i dati che gestisce sono troppo vecchi, se è così dovrebbe cancellarlo.

Sono nuovo alla libreria multithreading C++11 e ho le seguenti domande:

  1. Questa attività periodica è più adatta per std::thread o std::async ?

  2. Se usiamo std::async per quanto tempo è in esecuzione la funzione cleanUp? Fino a quando il DataManager non viene distrutto?

  3. È considerato buono il design di eseguire un std::async o std::thread nel costruttore?

class DataManager {

public:

DataManager() {
    handle = std::async(
                std::launch::async,
                &DataManager:cleanUp, this);
}

...

void DataManager::cleanUp() {

    while (true) {

        std::this_thread::sleep_for(
                        std::chrono::seconds(DATA_COLLECTOR_PERIOD));

        for (auto& d: dataCollection) {
            if (d.isTooOld()) {
               dataCollection.remove(d);
            }
        }
    }
}

private:
  std::future<void> handle;
  std::vector<Foo> dataCollection;

};
    
posta user695652 17.10.2016 - 16:58
fonte

1 risposta

2

La principale differenza tra generare direttamente un thread e usare std::async è che quest'ultimo ti dà un future - un wrapper relativamente pulito per recuperare il risultato di un calcolo fatto nel thread.

In breve, l'intento 1 qui è di pianificare un calcolo non appena possiamo specificare ciò che avremo (eventualmente) necessario, e dare al sistema la massima flessibilità nello svolgere tale calcolo nel il modo più comodo, con la speranza che migliori il throughput.

Questo non sembra adattarsi bene a questa situazione. Non stai generando il thread per produrre un risultato che non ti serve ancora. Piuttosto, il thread è destinato a funzionare come un "agente" che fa le sue cose, senza un vero "gioco finale" in vista. Di conseguenza, la maggior parte di ciò che std::async fornisce (il future ) rispetto a lavorare direttamente con un thread non è di reale utilità per il lavoro in questione. In quanto tale, potresti anche usare direttamente il thread.

Non vedo nulla di intrinsecamente sbagliato con la creazione di un thread in un ctor.

1. L'intento non si riflette perfettamente nello standard, ma c'è un lavoro in corso per migliorarlo.

    
risposta data 17.10.2016 - 18:50
fonte

Leggi altre domande sui tag