Fädeln Sie sichere Korutinen mit asio ein

8

Gibt es eine Möglichkeit, thread-sichere Coroutinen zusammen mit boost :: asio zu haben?

Ich möchte, dass ein io_service auf mehreren Threads läuft und einige meiner Handler Coroutinen haben.

Boost.Coroutine scheint eine Lösung zu sein, aber sie dokument , dass sie das Fortsetzen einer Coroutine, die in einem separaten Thread gestartet wurde, nicht unterstützen.

Soweit ich weiß, gibt es nur zwei mögliche Lösungen für dieses Problem:

  1. Verwenden Sie keine Koroutinen. Verwenden Sie die viel ausführlichere (auch mit Lambda), aber ebenso funktionale Methode der Verkettung von Rückrufen, die Zustand speichern.
  2. Erzwinge, dass jeder Handler nur in einem Thread ausgeführt wird. Ich weiß, dass dies möglich ist, indem Sie einfach einen separaten io_service für jeden Thread haben. Nebenbei, gibt es einen einfachen Weg, ähnlich wie io_service :: strand, um eine Gruppe von Handlern zu zwingen, in demselben Thread zu laufen?

Beide sind in keiner Weise gute Lösungen. In einer Lösung verliere ich Koroutinen. In der anderen verliere ich die meisten meiner Multithreading-Fähigkeit.

    
Lalaland 19.12.2011, 04:22
quelle

1 Antwort

3

Es scheint, dass dieses Problem keine einfache Lösung hat.

Das Hauptfehlerproblem ist wahrscheinlich auf die Tatsache zurückzuführen, dass C ++ es Compilern erlaubt, den Großteil dessen, was in einer Funktion passiert, neu zu ordnen. Somit kann man nicht zuverlässig auf die Reihenfolge der Dinge in den Funktionen angewiesen sein.

Es sieht so aus, als müsste ich am Ende eine Reihe von Callbacks verwenden, möglicherweise mit Lambdas, wenn ich den Wunsch haben möchte, dass alles semantisch wie ein Codeblock aussieht.

Vielleicht kann ich sogar etwas hacken, indem ich Makros verwende, die zu Lambda-Gleichungen aufgelöst werden, um den Koroutinenstil zu simulieren.

    
Lalaland 22.12.2011, 04:30
quelle

Tags und Links