Exam Solutions
Exam Solutions
1. **Semaphores Initialization:**
- `sem_B = sem_C = sem_D = 0`: Ensure that tasks B, C, and D wait
for task A.
- `sem_E = 0`: Ensure that task E waits for tasks B and C.
- `sem_F = 0`: Ensure that task F waits for tasks D and E.
2. **Pseudo-code Implementation:**
```c
Semaphore sem_B = 0, sem_C = 0, sem_D = 0;
Semaphore sem_E = 0, sem_F = 0;
Task A() {
// Task A's code
Signal(sem_B);
Signal(sem_C);
Signal(sem_D);
}
Task B() {
Wait(sem_B);
// Task B's code
Signal(sem_E);
}
Task C() {
Wait(sem_C);
// Task C's code
Signal(sem_E);
}
Task D() {
Wait(sem_D);
// Task D's code
Signal(sem_F);
}
Task E() {
Wait(sem_E);
// Task E's code
Signal(sem_F);
}
Task F() {
Wait(sem_F);
// Task F's code
}
```
1. **Thread Functions:**
2. **Pseudo-code Implementation:**
```c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_lock(&mutex);
total_sum += local_sum;
pthread_mutex_unlock(&mutex);
return NULL;
}
size = argc - 1;
array = malloc(size * sizeof(int));
for (int i = 0; i < size; i++) {
array[i] = atoi(argv[i + 1]);
}
pthread_join(th1, NULL);
pthread_join(th2, NULL);
pthread_mutex_destroy(&mutex);
free(array);
return 0;
}
```
We have three processes {P1, P2, P3} with actions {A1, A2, A3}. The
synchronization constraints are:
```c
Semaphore mutex = 1;
P1() {
Wait(mutex);
// Action A1
Signal(mutex);
}
P2() {
Wait(mutex);
// Action A2
Signal(mutex);
}
P3() {
Wait(mutex);
// Action A3
Signal(mutex);
}
```
2. **Case 2:** Actions A1, A2, and A3 must execute in the order A1,
A2, A3, and repeat.
```c
Semaphore sem_A1 = 1, sem_A2 = 0, sem_A3 = 0;
P1() {
Wait(sem_A1);
// Action A1
Signal(sem_A2);
}
P2() {
Wait(sem_A2);
// Action A2
Signal(sem_A3);
}
P3() {
Wait(sem_A3);
// Action A3
Signal(sem_A1);
}
```
3. **Case 3:** Actions A1, A2, and A3 must execute in the order A1
(A2 or A3), A1 (A2 or A3), and so on.
```c
Semaphore sem_A1 = 1, sem_A23 = 0;
P1() {
Wait(sem_A1);
// Action A1
Signal(sem_A23);
}
P2() {
Wait(sem_A23);
// Action A2
Signal(sem_A1);
}
P3() {
Wait(sem_A23);
// Action A3
Signal(sem_A1);
}
```