1 #include <boost/asio/execution.hpp> 2 #include <boost/asio/static_thread_pool.hpp> 3 #include <iostream> 4 5 using boost::asio::static_thread_pool; 6 namespace execution = boost::asio::execution; 7 8 // Traditional active object pattern. 9 // Member functions block until operation is finished. 10 11 class bank_account 12 { 13 int balance_ = 0; 14 mutable static_thread_pool pool_{1}; 15 16 public: deposit(int amount)17 void deposit(int amount) 18 { 19 execution::execute( 20 boost::asio::require(pool_.executor(), 21 execution::blocking.always), 22 [this, amount] 23 { 24 balance_ += amount; 25 }); 26 } 27 withdraw(int amount)28 void withdraw(int amount) 29 { 30 execution::execute( 31 boost::asio::require(pool_.executor(), 32 execution::blocking.always), 33 [this, amount] 34 { 35 if (balance_ >= amount) 36 balance_ -= amount; 37 }); 38 } 39 balance() const40 int balance() const 41 { 42 int result = 0; 43 execution::execute( 44 boost::asio::require(pool_.executor(), 45 execution::blocking.always), 46 [this, &result] 47 { 48 result = balance_; 49 }); 50 return result; 51 } 52 }; 53 main()54int main() 55 { 56 bank_account acct; 57 acct.deposit(20); 58 acct.withdraw(10); 59 std::cout << "balance = " << acct.balance() << "\n"; 60 } 61