barrier.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 <iostream>
  8. #include <stdexcept>
  9. #include <boost/assert.hpp>
  10. #include <boost/fiber/all.hpp>
  11. int value1 = 0;
  12. int value2 = 0;
  13. inline
  14. void fn1( boost::fibers::barrier & b)
  15. {
  16. boost::fibers::fiber::id id = boost::this_fiber::get_id();
  17. std::cout << "fiber " << id << ": fn1 entered" << std::endl;
  18. ++value1;
  19. std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
  20. boost::this_fiber::yield();
  21. std::cout << "fiber " << id << ": waits for barrier" << std::endl;
  22. b.wait();
  23. std::cout << "fiber " << id << ": passed barrier" << std::endl;
  24. ++value1;
  25. std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
  26. boost::this_fiber::yield();
  27. ++value1;
  28. std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
  29. boost::this_fiber::yield();
  30. ++value1;
  31. std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
  32. boost::this_fiber::yield();
  33. std::cout << "fiber " << id << ": fn1 returns" << std::endl;
  34. }
  35. inline
  36. void fn2( boost::fibers::barrier & b)
  37. {
  38. boost::fibers::fiber::id id = boost::this_fiber::get_id();
  39. std::cout << "fiber " << id << ": fn2 entered" << std::endl;
  40. ++value2;
  41. std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
  42. boost::this_fiber::yield();
  43. ++value2;
  44. std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
  45. boost::this_fiber::yield();
  46. ++value2;
  47. std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
  48. boost::this_fiber::yield();
  49. std::cout << "fiber " << id << ": waits for barrier" << std::endl;
  50. b.wait();
  51. std::cout << "fiber " << id << ": passed barrier" << std::endl;
  52. ++value2;
  53. std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
  54. boost::this_fiber::yield();
  55. std::cout << "fiber " << id << ": fn2 returns" << std::endl;
  56. }
  57. int main()
  58. {
  59. try
  60. {
  61. boost::fibers::barrier fb( 2);
  62. boost::fibers::fiber f1( & fn1, std::ref( fb) );
  63. boost::fibers::fiber f2( & fn2, std::ref( fb) );
  64. f1.join();
  65. f2.join();
  66. std::cout << "done." << std::endl;
  67. return EXIT_SUCCESS;
  68. }
  69. catch ( std::exception const& e)
  70. { std::cerr << "exception: " << e.what() << std::endl; }
  71. catch (...)
  72. { std::cerr << "unhandled exception" << std::endl; }
  73. return EXIT_FAILURE;
  74. }