]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/fiber/examples/barrier.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / fiber / examples / barrier.cpp
1 #include <cstdlib>
2 #include <functional>
3 #include <iostream>
4 #include <stdexcept>
5
6 #include <boost/assert.hpp>
7
8 #include <boost/fiber/all.hpp>
9
10 int value1 = 0;
11 int value2 = 0;
12
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
19 ++value1;
20 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
21 boost::this_fiber::yield();
22
23 std::cout << "fiber " << id << ": waits for barrier" << std::endl;
24 b.wait();
25 std::cout << "fiber " << id << ": passed barrier" << std::endl;
26
27 ++value1;
28 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
29 boost::this_fiber::yield();
30
31 ++value1;
32 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
33 boost::this_fiber::yield();
34
35 ++value1;
36 std::cout << "fiber " << id << ": incremented value1: " << value1 << std::endl;
37 boost::this_fiber::yield();
38
39 std::cout << "fiber " << id << ": fn1 returns" << std::endl;
40 }
41
42 inline
43 void fn2( boost::fibers::barrier & b)
44 {
45 boost::fibers::fiber::id id = boost::this_fiber::get_id();
46 std::cout << "fiber " << id << ": fn2 entered" << std::endl;
47
48 ++value2;
49 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
50 boost::this_fiber::yield();
51
52 ++value2;
53 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
54 boost::this_fiber::yield();
55
56 ++value2;
57 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
58 boost::this_fiber::yield();
59
60 std::cout << "fiber " << id << ": waits for barrier" << std::endl;
61 b.wait();
62 std::cout << "fiber " << id << ": passed barrier" << std::endl;
63
64 ++value2;
65 std::cout << "fiber " << id << ": incremented value2: " << value2 << std::endl;
66 boost::this_fiber::yield();
67
68 std::cout << "fiber " << id << ": fn2 returns" << std::endl;
69 }
70
71 int main()
72 {
73 try
74 {
75 boost::fibers::barrier fb( 2);
76
77 boost::fibers::fiber f1( & fn1, std::ref( fb) );
78 boost::fibers::fiber f2( & fn2, std::ref( fb) );
79
80 f1.join();
81 f2.join();
82
83 std::cout << "done." << std::endl;
84
85 return EXIT_SUCCESS;
86 }
87 catch ( std::exception const& e)
88 { std::cerr << "exception: " << e.what() << std::endl; }
89 catch (...)
90 { std::cerr << "unhandled exception" << std::endl; }
91 return EXIT_FAILURE;
92 }