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 № 1Możesz użyć boost.fiber - zapewnia API takie jak std :: thread. Niekoniecznie potrzebujesz boost.asio