/ / Przepisywanie wielowątkowego programu C ++ sterowanego zdarzeniami w celu korzystania z jednowątkowego doładowania :: asio - c ++, boost, boost-asio

Przepisywanie wielowątkowego programu C ++ sterowanego zdarzeniami w celu użycia boostu jednowątkowego :: asio - c ++, boost, boost-asio

Pracuję nad refaktoryzacją dużej bazy koduodpowiedzialny za operacje IO. Obecnie program składa się z wielu wątków, z których każdy czeka na otrzymanie zastrzeżonych zdarzeń. Zdarzenia są wysyłane do globalnej kolejki zdarzeń i są odbierane przez wszystkie wątki (globalny dyspozytor zdarzeń wywołuje funkcję obsługi zdarzeń dla każdego wątku, a ten wątek określa, czy powinien zrobić coś w zależności od typu zdarzenia i, jeśli to konieczne, dodaje, że zdarzenie do własnej kolejki roboczej).

Ta architektura ma wiele narzutów, zarówno z powodudo posiadania wielu wątków (około 12 na rdzeniu z jednym ramieniem), które w większości śpią i ze względu na kolejki robocze. Wymaga również kilkuset różnych klas zdarzeń, co zmniejsza możliwość konserwacji.

Chciałbym zastąpić to wydarzenie na podstawiearchitektura z jedną wątkową metodologią asio boost, ale nie jestem pewien, jakiego paradygmatu powinienem użyć, aby to zrobić. Myślę, że boost :: io_service może być najlepszy, ale być może coroutines, włókna lub coś innego byłoby lepsze.

Czy ktoś ma jakieś sugestie, które zwiększenie ::paradygmat asio spowodowałby płynniejsze przejście podczas opuszczania kolejki zdarzeń? Szukam czegoś, co poprawi utrzymywanie kodu, a nie uczyni go całkowicie niezrozumiałym w zamian za zmniejszenie narzutu.

Wygląda to obiecująco, ale składnia coroutine jest nieco przerażająca i trudno będzie ją sprzedać reszcie mojego zespołu: http://www.boost.org/doc/libs/1_57_0/libs/coroutine/doc/html/coroutine/motivation.html

Odpowiedzi:

0 dla odpowiedzi № 1

Możesz użyć boost.fiber - zapewnia API takie jak std :: thread. Niekoniecznie potrzebujesz boost.asio