2011-12-19 19 views
8

Czy istnieje sposób, w jaki mogę mieć bezpieczne dla wątków coroutines wraz z boost :: asio?Gwintowe coroutiny z asio

Chcę, aby jeden io_service był uruchomiony na wielu wątkach i aby niektóre z moich programów obsługi były współprogramami.

Boost.Coroutine wydaje się być rozwiązaniem, ale one document nie obsługują wznowienia coroutine, który został uruchomiony w osobnym wątku.

O ile wiem, że są tylko dwa możliwe rozwiązania tego problemu:

  1. Nie używają współprogram. Używaj dużo bardziej gadatliwej (nawet z lambda), ale równie funkcjonalnej metody łączenia zwrotów zwrotnych od stanu sklepu.
  2. Wymuszaj uruchamianie każdego programu obsługi tylko w jednym wątku. Wiem, że jest to możliwe, po prostu mając oddzielne io_service dla każdego wątku. Na marginesie, czy istnieje prosty sposób, podobny do io_service :: strand, aby zmusić zestaw procedur obsługi do działania w tym samym wątku?

W żaden sposób nie są dobre rozwiązania. W jednym rozwiązaniu tracę coroutines. W innym tracę większość mojej zdolności wielowątkowej.

+1

FYI: Widziałeś http://blog.think-async.com/2009/08/secret-sauce-revealed.html i http://blog.think-async.com/2010/03/pl/ guide-to-stackless-coroutines.html? – Ralf

+0

@Ralf Yeah Widziałem to, dlatego właśnie zadaję to pytanie. Wydaje się, że jest to bardzo fajny pomysł i łatwiejszy sposób pisania asynchronicznego kodu. – Lalaland

Odpowiedz

3

Wygląda na to, że ten problem nie jest łatwy.

Główny problem związany z błędami wynika prawdopodobnie z faktu, że C++ umożliwia kompilatorom zmianę kolejności większości czynności wykonywanych w funkcji. W ten sposób nie można niezawodnie polegać na kolejności rzeczy dziejących się w funkcjach.

Wygląda na to, że będę musiał użyć serii wywołań zwrotnych, być może używając lambda, jeśli mam chęć, aby wszystko wyglądało semantycznie jak blok kodu.

Być może uda mi się zhakować coś za pomocą makr, które zostaną przekształcone w lambdy, aby zasymulować styl korupcji.

+0

FYI, wywołania zwrotne są doskonałym sterownikiem dla współpra- cowników, jeśli istnieje biblioteka coroutines, która uruchamia resztę konturu wewnątrz wywołania zwrotnego (https://code.google.com/p/libglim/source/browse/trunk/test_cbcoro .cc). – ArtemGr

Powiązane problemy