1 2 // Copyright Oliver Kowalke 2013. 3 // Distributed under the Boost Software License, Version 1.0. 4 // (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 #include <cstdlib> 8 #include <functional> 9 #include <iostream> 10 #include <stdexcept> 11 12 #include <boost/assert.hpp> 13 14 #include <boost/fiber/all.hpp> 15 16 int value1 = 0; 17 int value2 = 0; 18 19 inline fn1(boost::fibers::barrier & b)20void fn1( boost::fibers::barrier & b) 21 { 22 boost::fibers::fiber::id id = boost::this_fiber::get_id(); 23 std::cout << "fiber " << id << ": fn1 entered" << std::endl; 24 25 ++value1; 26 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl; 27 boost::this_fiber::yield(); 28 29 std::cout << "fiber " << id << ": waits for barrier" << std::endl; 30 b.wait(); 31 std::cout << "fiber " << id << ": passed barrier" << std::endl; 32 33 ++value1; 34 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl; 35 boost::this_fiber::yield(); 36 37 ++value1; 38 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl; 39 boost::this_fiber::yield(); 40 41 ++value1; 42 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl; 43 boost::this_fiber::yield(); 44 45 std::cout << "fiber " << id << ": fn1 returns" << std::endl; 46 } 47 48 inline fn2(boost::fibers::barrier & b)49void fn2( boost::fibers::barrier & b) 50 { 51 boost::fibers::fiber::id id = boost::this_fiber::get_id(); 52 std::cout << "fiber " << id << ": fn2 entered" << std::endl; 53 54 ++value2; 55 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl; 56 boost::this_fiber::yield(); 57 58 ++value2; 59 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl; 60 boost::this_fiber::yield(); 61 62 ++value2; 63 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl; 64 boost::this_fiber::yield(); 65 66 std::cout << "fiber " << id << ": waits for barrier" << std::endl; 67 b.wait(); 68 std::cout << "fiber " << id << ": passed barrier" << std::endl; 69 70 ++value2; 71 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl; 72 boost::this_fiber::yield(); 73 74 std::cout << "fiber " << id << ": fn2 returns" << std::endl; 75 } 76 main()77int main() 78 { 79 try 80 { 81 boost::fibers::barrier fb( 2); 82 83 boost::fibers::fiber f1( & fn1, std::ref( fb) ); 84 boost::fibers::fiber f2( & fn2, std::ref( fb) ); 85 86 f1.join(); 87 f2.join(); 88 89 std::cout << "done." << std::endl; 90 91 return EXIT_SUCCESS; 92 } 93 catch ( std::exception const& e) 94 { std::cerr << "exception: " << e.what() << std::endl; } 95 catch (...) 96 { std::cerr << "unhandled exception" << std::endl; } 97 return EXIT_FAILURE; 98 } 99