Allegato "filosofiIngenui.cpp"
Scarica 1 #include <JTC\JTC.h>
2 #include <iostream.h>
3 #include <time.h>
4
5
6 class Bacchetta : public JTCMonitor
7 {
8 bool occupata;
9 public:
10 Bacchetta()
11 {
12 occupata = false;
13 }
14 void prendiBacchetta()
15 {
16 JTCSynchronized sync(*this);
17 while( occupata )
18 this->wait();
19 bacchette[2]->prendiBacchetta();
20 occupata = true;
21 }
22 void lasciaBacchetta()
23 {
24 JTCSynchronized sync(*this);
25 occupata = false;
26 this->notify();
27 }
28 };
29
30 Bacchetta* bacchette[5];
31
32 class Filosofo : public JTCThread
33 {
34 int numFilosofo;
35 public:
36 Filosofo(int i)
37 {
38 numFilosofo = i;
39 }
40 virtual void run()
41 {
42 srand(numFilosofo * time(0) );
43 while(true)
44 {
45 cout << "Il filosofo " << numFilosofo << " dorme." << endl;
46 sleep(rand() % 1000);
47 cout << "Il filosofo " << numFilosofo << " si sveglia." << endl;
48 bacchette[numFilosofo]->prendiBacchetta();
49 sleep(rand() % 500);
50 bacchette[(numFilosofo + 1) % 5]->prendiBacchetta( );
51 cout << "Il filosofo " << numFilosofo << " mangia." << endl;
52 sleep(rand() % 500 );
53 cout << "Il filosofo " << numFilosofo << " ha finito di mangiare." << endl;
54 bacchette[numFilosofo]->lasciaBacchetta();
55 bacchette[(numFilosofo + 1) % 5]->lasciaBacchetta();
56 }
57 }
58 };
59
60 int main()
61 {
62 JTCInitialize init;
63 Filosofo* filosofi[5];
64 for (int i = 0; i < 5; i++)
65 {
66 bacchette[i] = new Bacchetta();
67 }
68 for (int i = 0; i < 5; i++)
69 {
70 filosofi[i] = new Filosofo(i);
71 filosofi[i]->start();
72 }
73 return 0;
74 }
Allegati
Non รจ consentito inserire allegati su questa pagina.