Use mutable lambdas with their own state variables.
diff --git a/asio/src/examples/cpp11/go/echo_server.cpp b/asio/src/examples/cpp11/go/echo_server.cpp index 0980b09..ab6040d 100644 --- a/asio/src/examples/cpp11/go/echo_server.cpp +++ b/asio/src/examples/cpp11/go/echo_server.cpp
@@ -33,8 +33,12 @@ void go() { auto self(shared_from_this()); + + std::size_t n = 0; + char data[128] = ""; + asio::go(strand_, - [this, self](asio::stackless_context ctx) + [this, self, n, data](asio::stackless_context ctx) mutable { try { @@ -43,8 +47,8 @@ for (;;) { timer_.expires_from_now(std::chrono::seconds(10)); - await n_ = socket_.async_read_some(asio::buffer(data_), ctx); - yield asio::async_write(socket_, asio::buffer(data_, n_), ctx); + await n = socket_.async_read_some(asio::buffer(data), ctx); + yield asio::async_write(socket_, asio::buffer(data, n), ctx); } } } @@ -55,14 +59,16 @@ } }); + asio::error_code ignored_ec; + asio::go(strand_, - [this, self](asio::stackless_context ctx) + [this, self, ignored_ec](asio::stackless_context ctx) mutable { reenter (ctx) { while (socket_.is_open()) { - yield timer_.async_wait(ctx[ignored_ec_]); + yield timer_.async_wait(ctx[ignored_ec]); if (timer_.expires_from_now() <= std::chrono::seconds(0)) socket_.close(); } @@ -74,9 +80,6 @@ tcp::socket socket_; asio::steady_timer timer_; asio::io_service::strand strand_; - char data_[128]; - std::size_t n_; - asio::error_code ignored_ec_; }; int main(int argc, char* argv[])