00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <core/threading/thread.h>
00027 #include <core/threading/wait_condition.h>
00028 #include <core/threading/mutex.h>
00029
00030 #include <iostream>
00031
00032 using namespace std;
00033 using namespace fawkes;
00034
00035
00036
00037
00038 class ExampleWaitCondThread : public Thread
00039 {
00040 public:
00041
00042
00043
00044
00045
00046
00047
00048 ExampleWaitCondThread(WaitCondition *wc, Mutex *m, int *val, int actval, int maxval)
00049 : Thread("ExampleWaitCondThread", Thread::OPMODE_CONTINUOUS)
00050 {
00051 this->wc = wc;
00052 this->m = m;
00053 this->val = val;
00054 this->actval = actval;
00055 this->maxval = maxval;
00056 }
00057
00058
00059
00060 virtual void loop()
00061 {
00062 m->lock();
00063 while (*val != actval) {
00064 wc->wait();
00065 }
00066 cout << *val << " called" << endl;
00067 *val += 1;
00068 if ( *val > maxval ) {
00069 *val = 0;
00070 }
00071
00072 m->unlock();
00073
00074
00075
00076
00077 wc->wake_all();
00078 }
00079
00080 private:
00081 WaitCondition *wc;
00082 Mutex *m;
00083
00084 int *val;
00085 int actval;
00086 int maxval;
00087
00088 };
00089
00090
00091
00092
00093 int
00094 main(int argc, char **argv)
00095 {
00096
00097 int val = 0;
00098
00099 Mutex *m = new Mutex();
00100 WaitCondition *wc = new WaitCondition(m);
00101
00102 ExampleWaitCondThread *t1 = new ExampleWaitCondThread(wc, m, &val, 0, 4);
00103 ExampleWaitCondThread *t2 = new ExampleWaitCondThread(wc, m, &val, 1, 4);
00104 ExampleWaitCondThread *t3 = new ExampleWaitCondThread(wc, m, &val, 2, 4);
00105 ExampleWaitCondThread *t4 = new ExampleWaitCondThread(wc, m, &val, 3, 4);
00106 ExampleWaitCondThread *t5 = new ExampleWaitCondThread(wc, m, &val, 4, 4);
00107
00108 t1->start();
00109 t2->start();
00110 t3->start();
00111 t4->start();
00112 t5->start();
00113
00114 t1->join();
00115 t2->join();
00116 t3->join();
00117 t4->join();
00118 t5->join();
00119
00120 delete t5;
00121 delete t4;
00122 delete t3;
00123 delete t2;
00124 delete t1;
00125 delete wc;
00126 delete m;
00127
00128 return 0;
00129 }
00130
00131
00132