2013-03-30 15 views
6

Dla niektórych programów współbieżnych mogłem użyć koncepcji Javy CountDownLatch. Czy istnieje odpowiednik dla C++ 11, czy jak to się nazywa w C++?CountDownLatch odpowiednik

Chcę tylko wywołać funkcję, gdy licznik osiągnie zero.

Jeśli nie jest jeszcze chciałbym napisać sobie klasę jak następuje:

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; 
}; 

Czy coś podobnego już dostępne w dowolnym miejscu?

Scenariusz jest:

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

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

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

Co to jest dokładnie w tym przypadku? – Xeo

+0

Dodałem przykład użycia. – abergmeier

+1

Więc zasadniczo chcesz wykonać wywołanie zwrotne po zakończeniu wszystkich zadań asynchronicznych? Jeśli tak, możesz bezpośrednio nadużyć deltera 'shared_ptr' i porzucić ręczne ubytki. – Xeo

Odpowiedz

2

Jest proposal pokrycia tego standardu dla przyszłorocznego C++. Implementacja jest dostępna jako część google concurrency library.

+0

Podczas gdy 'gcl :: countdown_latch 'nie jest tak naprawdę tym, czego szukam (ponieważ jest to wariant blokujący), myślę, że odpowiedziałeś tytułem pytania najlepiej. Naprawdę chciałbym zamienić 'countDown' na' --' ale to tylko ja. – abergmeier