]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/fiber/examples/barrier.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / fiber / examples / barrier.cpp
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
20 void 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
49 void 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
77 int 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 }