join.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright Oliver Kowalke 2013.
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #include <cstdlib>
  6. #include <functional>
  7. #include <stdexcept>
  8. #include <iostream>
  9. #include <string>
  10. #include <boost/fiber/all.hpp>
  11. int value1 = 0;
  12. int value2 = 0;
  13. void fn1()
  14. {
  15. boost::fibers::fiber::id this_id = boost::this_fiber::get_id();
  16. for ( int i = 0; i < 5; ++i)
  17. {
  18. ++value1;
  19. std::cout << "fiber " << this_id << " fn1: increment value1: " << value1 << std::endl;
  20. boost::this_fiber::yield();
  21. }
  22. std::cout << "fiber " << this_id << " fn1: returns" << std::endl;
  23. }
  24. void fn2( boost::fibers::fiber & f)
  25. {
  26. boost::fibers::fiber::id this_id = boost::this_fiber::get_id();
  27. for ( int i = 0; i < 5; ++i)
  28. {
  29. ++value2;
  30. std::cout << "fiber " << this_id << " fn2: increment value2: " << value2 << std::endl;
  31. if ( i == 1)
  32. {
  33. boost::fibers::fiber::id id = f.get_id();
  34. std::cout << "fiber " << this_id << " fn2: joins fiber " << id << std::endl;
  35. f.join();
  36. std::cout << "fiber " << this_id << " fn2: joined fiber " << id << std::endl;
  37. }
  38. boost::this_fiber::yield();
  39. }
  40. std::cout << "fiber " << this_id << " fn2: returns" << std::endl;
  41. }
  42. int main()
  43. {
  44. try
  45. {
  46. boost::fibers::fiber f1( fn1);
  47. boost::fibers::fiber f2( fn2, std::ref( f1) );
  48. f2.join();
  49. std::cout << "done." << std::endl;
  50. return EXIT_SUCCESS;
  51. }
  52. catch ( std::exception const& e)
  53. { std::cerr << "exception: " << e.what() << std::endl; }
  54. catch (...)
  55. { std::cerr << "unhandled exception" << std::endl; }
  56. return EXIT_FAILURE;
  57. }