• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)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
fn2(boost::fibers::barrier & b)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 
main()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 }
99