2013-03-30 14 views
6

Per alcuni programmi concorrenti, è possibile utilizzare il concetto Java CountDownLatch. Esiste un equivalente per C++ 11 o quale sarebbe il concetto chiamato in C++?CountDownLatch Equivalente

Quello che voglio è richiamare una funzione una volta che il conteggio ha raggiunto lo zero.

Se c'è non ancora vorrei scrivere io stesso una classe come la seguente:

class countdown_function { 
public: 
    countdown_function(size_t count); 
    countdown_function(const countdown_function&) = default; 
    countdown_function(countdown_function&&) = default; 
    countdown_function& operator=(const countdown_function&) = default; 
    countdown_function& operator=(countdown_function&&) = default; 
    // Callback to be invoked 
    countdown_function& operator=(std::function<void()> callback); 
    countdown_function& operator--(); 
private: 
    struct internal { 
    std::function<void()> _callback; 
    size_t _count; 
    // + some concurrent handling 
    }; 
    // Make sure this class can be copied but still references 
    // same state 
    std::shared_ptr<internal> _state; 
}; 

è qualcosa di simile già disponibili da qualche parte?

Scenario è:

countdown_function counter(2); 
counter = [success_callback]() { 
    success_callback(); 
}; 

startTask1Async([counter, somework]() { 
    somework(); 
    --counter; 
}, errorCallback); 

startTask2Async([counter, otherwork]() { 
    otherwork(); 
    --counter; 
}, errorCallback); 
+0

Qual è esattamente l'uso per questo? – Xeo

+0

Ho aggiunto un esempio di utilizzo. – abergmeier

+1

Quindi, fondamentalmente, vuoi eseguire una richiamata quando tutte le attività asincrone sono state completate? In caso affermativo, si può semplicemente abusare direttamente deleter di 'shared_ptr' e abbandonare il decremento manuale. – Xeo

risposta

2

C'è un proposal che copre questo per lo standard della prossima C++. Un'implementazione è disponibile come parte di google concurrency library.

+0

Mentre 'gcl :: countdown_latch 'non è proprio quello che sto cercando (dato che è una variante di blocco), penso che tu abbia risposto alla domanda del titolo il meglio. E mi piacerebbe davvero sostituire 'countDown' con' --' ma quello sono solo io. – abergmeier