source: xplcommon/test/testmutex.cc@ 39:f9c840ac038d

Last change on this file since 39:f9c840ac038d was 32:4bef4944955f, checked in by István Váradi <ivaradi@…>, 12 years ago

Implemented mutex with test program

File size: 4.4 KB
Line 
1// Copyright (c) 2012 by István Váradi
2
3// This file is part of libxplcommon, a common utility library for
4// development related to X-Plane
5
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are met:
8
9// 1. Redistributions of source code must retain the above copyright notice, this
10// list of conditions and the following disclaimer.
11// 2. Redistributions in binary form must reproduce the above copyright notice,
12// this list of conditions and the following disclaimer in the documentation
13// and/or other materials provided with the distribution.
14
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26// The views and conclusions contained in the software and documentation are those
27// of the authors and should not be interpreted as representing official policies,
28// either expressed or implied, of the FreeBSD Project.
29
30//------------------------------------------------------------------------------
31
32#include <xplcommon/Thread.h>
33#include <xplcommon/Mutex.h>
34
35#include <cstdlib>
36#include <cstdio>
37#include <cassert>
38
39#include <signal.h>
40
41#include <sys/time.h>
42
43//------------------------------------------------------------------------------
44
45using xplcommon::Thread;
46using xplcommon::Mutex;
47
48//------------------------------------------------------------------------------
49//------------------------------------------------------------------------------
50
51class Thread1 : public Thread
52{
53private:
54 Mutex& mutex;
55
56public:
57 Thread1(Mutex& mutex);
58
59 virtual void run();
60};
61
62//------------------------------------------------------------------------------
63
64inline Thread1::Thread1(Mutex& mutex) :
65 mutex(mutex)
66{
67}
68
69//------------------------------------------------------------------------------
70
71void Thread1::run()
72{
73 printf("Thread1::run: locking mutex\n");
74 mutex.lock();
75 printf("Thread1::run: locked mutex, sleeping...\n");
76
77 sleep(5000);
78
79 printf("Thread1::run: woke up, releasing mutex\n");
80 mutex.unlock();
81
82 printf("Thread1::run: released mutex, sleeping\n");
83
84 sleep(1000);
85
86 printf("Thread1::run: woke up, locking mutex\n");
87 mutex.lock();
88 printf("Thread1::run: locked mutex, releasing\n");
89 mutex.unlock();
90
91}
92
93//------------------------------------------------------------------------------
94//------------------------------------------------------------------------------
95
96class Thread2 : public Thread
97{
98private:
99 Mutex& mutex;
100
101public:
102 Thread2(Mutex& mutex);
103
104 virtual void run();
105};
106
107//------------------------------------------------------------------------------
108
109inline Thread2::Thread2(Mutex& mutex) :
110 mutex(mutex)
111{
112}
113
114//------------------------------------------------------------------------------
115
116void Thread2::run()
117{
118 printf("Thread2::run: sleeping\n");
119 sleep(1000);
120
121 printf("Thread2::run: woke up, trying to lock mutex...\n");
122
123 while(!mutex.tryLock()) {
124 sleep(200);
125 }
126
127 printf("Thread2::run: locked mutex, sleeping...\n");
128 sleep(5000);
129 printf("Thread2::run: woke up, releasing mutex\n");
130 mutex.unlock();
131}
132
133//------------------------------------------------------------------------------
134//------------------------------------------------------------------------------
135
136int main()
137{
138 Mutex mutex;
139
140 Thread1 thread1(mutex);
141 Thread2 thread2(mutex);
142
143 printf("Starting threads\n");
144 thread1.start();
145 thread2.start();
146
147
148 printf("Waiting for thread1\n");
149 thread1.join();
150 printf("Waiting for thread2\n");
151 thread2.join();
152 printf("Both threads returned\n");
153
154 return 0;
155}
156
157//------------------------------------------------------------------------------
158
159// Local Variables:
160// mode: C++
161// c-basic-offset: 4
162// indent-tabs-mode: nil
163// End:
Note: See TracBrowser for help on using the repository browser.