7

Czy można wykonać asynchroniczne oczekiwanie (odczyt: nieblokujące) na zmiennej warunkowej w boost :: asio? jeśli nie jest obsługiwany bezpośrednio, docenione zostaną wszelkie wskazówki dotyczące jego implementacji.doładowanie asio asynchronicznie oczekujące na zmienną warunku

Mogę zaimplementować zegar i uruchomić budzenie nawet co kilka ms, ale to podejście jest znacznie gorsze, trudno mi uwierzyć, że zmienna synchronizacja warunków nie jest zaimplementowana/udokumentowana.

+0

Co chcesz zrobić ??? - czy jest to prawdopodobnie ostatnia wersja [async_read_until] (http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/async_read_until.html), której szukasz? czekanie bez blokady jest normalnym zadaniem dla [wątku doładowania] (http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html) ... wątku doładowania w połączeniu ze zwiększeniem asio powinno działać ... – jenseb

+0

Mam na myśli alternatywną implementację, przedstawiłem ją w innym pytaniu tutaj. http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc To może dać ci lepszy wgląd w to, co chcę osiągnąć. –

Odpowiedz

7

Jeśli dobrze rozumiem intencji, chcesz uruchomić procedurę obsługi zdarzeń, gdy niektóre zmienne warunku jest sygnalizowane, w kontekście puli wątku Asio? Myślę, że byłoby to wystarczające, aby czekać na zmiennej warunkowej na początku procedury obsługi i io_service::post() sama z powrotem w basenie w końcu coś z tego rodzaju:

#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
boost::asio::io_service io; 
boost::mutex mx; 
boost::condition_variable cv; 
void handler() 
{ 
    boost::unique_lock<boost::mutex> lk(mx); 
     cv.wait(lk); 
    std::cout << "handler awakened\n"; 
    io.post(handler); 
} 
void buzzer() 
{ 
    for(;;) 
    { 
     boost::this_thread::sleep(boost::posix_time::seconds(1)); 
     boost::lock_guard<boost::mutex> lk(mx); 
      cv.notify_all(); 
    } 
} 
int main() 
{ 
    io.post(handler); 
    boost::thread bt(buzzer); 
    io.run(); 
} 
+4

ale wątek, który czeka zostanie zablokowany, czy nie istnieje sposób na zablokowanie wątku, ale zamiast tego rejestrowanie programu obsługi zakończenia? Obecnie znajduje się tutaj alternatywny mechanizm: http://stackoverflow.com/questions/6776779/boost-asio-multi-io-service-rpc-framework-design-rfc –

+0

@Hassan Syed: zmienna warunku to pojęcie, które obejmuje zablokowany wątek. Być może zamiast tego szukasz sygnałów asynchronicznych? boost.asio właśnie dodał wsparcie dla procedur obsługi sygnałów w 1.47.0: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/history.html – Cubbi

+0

O ile wiem, są to sygnały emitowane przez system operacyjny. Pokazane jest, że możesz zarejestrować się na te sygnały, ale to system operacyjny je wyemituje. –

Powiązane problemy