-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathacc_l.cpp
More file actions
107 lines (57 loc) · 1.61 KB
/
acc_l.cpp
File metadata and controls
107 lines (57 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <semaphore.h>
#include <sys/mman.h>
using namespace std;
int * total = (int *) mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0 , 0); // initialize shared memory
sem_t *lock;
void handlerA(){
int curr;
for(int i = 0; i < 5 ; i++){
sem_wait(lock);
cout << "Child A count " << i+1 << " : Current value is " << *total << endl;
curr = *total;
sleep(rand() % 7);
*total = curr + 200;
cout << "Child A count " << i+1 << " : After updating value is " << *total << endl;
sem_post(lock);
}
}
void handlerB(){
int curr;
for(int i = 0; i < 5 ; i++){
sem_wait(lock);
cout << "Child B count " << i+1 << " : Current value is " << *total << endl;
curr = *total;
sleep(rand() % 7);
*total = curr + 100;
cout << "Child B count " << i+1 << " : After updating value is " << *total << endl;
sem_post(lock);
}
}
int main(){
int rv;
*total = 1000; // store 1000 as starting value
pid_t ppid = getpid(); // get pid of the parent process
lock = sem_open("lock", O_CREAT | O_EXCL, 0666 , 1); // initialize lock
cout << "Parent : Current value is " << *total << endl;
for(int i = 0; i < 2 && ppid == getpid() ; i++){ // spawn two children
switch(fork()){ // create a child
case 0:
if(i == 0)
handlerA(); // handler for process A
else
handlerB(); // handler for process B
break;
default:
break;
}
}
for(int i = 0; i < 2 && ppid == getpid() ; i++){
wait(&rv);
}
sem_unlink("lock");
}