1// Copyright (C) 2010 Vicente Botet
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6// bm.cpp
7
8// g++ test.cpp -lboost_thread-mt && ./a.out
9
10// the ration of XXX and YYY determines
11// if this works or deadlocks
12int XXX = 20;
13int YYY = 10;
14
15#include <boost/thread/thread_only.hpp>
16#include <boost/thread/shared_mutex.hpp>
17
18//#include <unistd.h>
19#include <iostream>
20#include <boost/detail/lightweight_test.hpp>
21
22using namespace std;
23
24//void sleepmillis(useconds_t miliis)
25void sleepmillis(int miliis)
26{
27 //usleep(miliis * 1000);
28 boost::this_thread::sleep(rel_time: boost::posix_time::milliseconds(miliis));
29}
30
31void worker1(boost::shared_mutex * lk, int * x)
32{
33 (*x)++; // 1
34 cout << "lock b try " << *x << endl;
35 while (1)
36 {
37 if (lk->timed_lock(relative_time: boost::posix_time::milliseconds(XXX))) break;
38 sleepmillis(miliis: YYY);
39 }
40 cout << "lock b got " << *x << endl;
41 (*x)++; // 2
42 lk->unlock();
43}
44
45void worker2(boost::shared_mutex * lk, int * x)
46{
47 cout << "lock c try" << endl;
48 lk->lock_shared();
49 (*x)++;
50 cout << "lock c got" << endl;
51 lk->unlock_shared();
52 cout << "lock c unlocked" << endl;
53 (*x)++;
54}
55
56int main()
57{
58
59 // create
60 boost::shared_mutex* lk = new boost::shared_mutex();
61
62 // read lock
63 cout << "lock a" << endl;
64 lk->lock_shared();
65
66 int x1 = 0;
67 boost::thread t1(boost::bind(f: worker1, a1: lk, a2: &x1));
68 while (!x1)
69 ;
70 BOOST_TEST(x1 == 1);
71 sleepmillis(miliis: 500);
72 BOOST_TEST(x1 == 1);
73
74 int x2 = 0;
75 boost::thread t2(boost::bind(f: worker2, a1: lk, a2: &x2));
76 t2.join();
77 BOOST_TEST(x2 == 2);
78
79 lk->unlock_shared();
80 cout << "unlock a" << endl;
81
82 for (int i = 0; i < 2000; i++)
83 {
84 if (x1 == 2) break;
85 sleepmillis(miliis: 10);
86 }
87
88 BOOST_TEST(x1 == 2);
89 t1.join();
90 delete lk;
91
92 return 0;
93}
94

source code of boost/libs/thread/test/test_5502.cpp