feat: Initial commit
This commit is contained in:
28
Lab08/ex1.c
Normal file
28
Lab08/ex1.c
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
int ticketNumber;
|
||||
int turnNumber;
|
||||
|
||||
int atomicIncrement (int *var) {
|
||||
int tmp = *var;
|
||||
*var = tmp + 1;
|
||||
return (tmp);
|
||||
}
|
||||
|
||||
void init() {
|
||||
ticketNumber = 0;
|
||||
turnNumber = 0;
|
||||
}
|
||||
|
||||
void lock() {
|
||||
int ticket = atomicIncrement(&ticketNumber);
|
||||
|
||||
while (ticket != turnNumber);
|
||||
|
||||
void unlock() {
|
||||
atomicIncrement(turnNumber);
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
|
||||
}
|
||||
80
Lab08/ex2.c
Normal file
80
Lab08/ex2.c
Normal file
@@ -0,0 +1,80 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef int * sem;
|
||||
|
||||
sem sem_init() {
|
||||
sem s = calloc(2, sizeof(int));
|
||||
pipe(s);
|
||||
return s;
|
||||
}
|
||||
|
||||
void sem_lock(sem s) {
|
||||
int tmp;
|
||||
if (read(s[0], &tmp, 1)<0) exit(1);
|
||||
}
|
||||
|
||||
void sem_multi_lock(sem s, int n) {
|
||||
for (int i = 0; i < n; i++) sem_lock(s);
|
||||
}
|
||||
|
||||
void sem_signal(sem s) {
|
||||
if (write(s[1], "0", 1)<0) exit(1);
|
||||
}
|
||||
|
||||
void A(sem sB, sem sC, sem sD) {
|
||||
puts("A");
|
||||
sem_signal(sB);
|
||||
sem_signal(sC);
|
||||
sem_signal(sD);
|
||||
}
|
||||
|
||||
void single_proc(sem x, sem y, int N, char * name) {
|
||||
sem_multi_lock(x, N);
|
||||
puts(name);
|
||||
sem_signal(y);
|
||||
}
|
||||
|
||||
void C(sem sC, sem sE, sem sF) {
|
||||
sem_lock(sC);
|
||||
puts("C");
|
||||
sem_signal(sE);
|
||||
sem_signal(sF);
|
||||
}
|
||||
|
||||
int main() {
|
||||
sem sA, sB, sC, sD, sE, sF, sG, sH, sI;
|
||||
sA = sem_init();
|
||||
sB = sem_init();
|
||||
sC = sem_init();
|
||||
sD = sem_init();
|
||||
sE = sem_init();
|
||||
sF = sem_init();
|
||||
sG = sem_init();
|
||||
sH = sem_init();
|
||||
sI = sem_init();
|
||||
while(1) {
|
||||
if (!fork()) {
|
||||
A(sB,sC,sD);
|
||||
} else if (!fork()) {
|
||||
single_proc(sB, sI, 1, "B");
|
||||
} else if (!fork()) {
|
||||
C(sC, sE, sF);
|
||||
} else if (!fork()) {
|
||||
single_proc(sD, sH, 1, "D");
|
||||
} else if (!fork()) {
|
||||
single_proc(sE, sG, 1, "E");
|
||||
} else if (!fork()) {
|
||||
single_proc(sF, sG, 1, "F");
|
||||
} else if (!fork()) {
|
||||
single_proc(sG, sI, 2, "G");
|
||||
} else if (!fork()) {
|
||||
single_proc(sH, sI, 1, "H");
|
||||
} else if (!fork()) {
|
||||
single_proc(sI, sA, 3, "I");
|
||||
}
|
||||
sem_lock(sA);
|
||||
sleep(5);
|
||||
}
|
||||
}
|
||||
57
Lab08/ex4.c
Normal file
57
Lab08/ex4.c
Normal file
@@ -0,0 +1,57 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
|
||||
sem_t *sems[6];
|
||||
|
||||
typedef struct params {
|
||||
int sPrev;
|
||||
int sNext;
|
||||
int nPrev;
|
||||
int nNext;
|
||||
char * name;
|
||||
} *params_t;
|
||||
|
||||
void* t_code(void * arg) {
|
||||
params_t p = (params_t) arg;
|
||||
while (1) {
|
||||
for (int i = 0; i < p->nPrev; i++) sem_wait(sems[p->sPrev]);
|
||||
puts(p->name);
|
||||
sleep(3);
|
||||
for (int i = 0; i < p->nNext; i++) sem_post(sems[p->sNext]);
|
||||
}
|
||||
free(p);
|
||||
}
|
||||
|
||||
pthread_t* start_t(int sPrev, int sNext, int nPrev, int nNext, char * name) {
|
||||
pthread_t *t;
|
||||
params_t p = malloc(sizeof(struct params));
|
||||
p->sPrev = sPrev;
|
||||
p->sNext = sNext;
|
||||
p->nPrev = nPrev;
|
||||
p->nNext = nNext;
|
||||
p->name = name;
|
||||
pthread_create(t, NULL, t_code, (void *) p);
|
||||
return t;
|
||||
}
|
||||
|
||||
int main() {
|
||||
for (int i = 0; i < 6; i++) {
|
||||
sems[i] = malloc(sizeof(sem_t));
|
||||
sem_init(sems[i], 0, 0);
|
||||
}
|
||||
sem_post(sems[0]);
|
||||
start_t(0, 1, 1, 3, "A");
|
||||
start_t(1, 2, 1, 1, "B");
|
||||
start_t(1, 3, 1, 2, "C");
|
||||
start_t(1, 4, 1, 1, "D");
|
||||
start_t(3, 5, 1, 1, "E");
|
||||
start_t(3, 5, 1, 1, "F");
|
||||
start_t(5, 2, 1, 1, "G");
|
||||
start_t(4, 2, 1, 1, "H");
|
||||
start_t(2, 0, 3, 1, "I");
|
||||
|
||||
sleep(24);
|
||||
}
|
||||
Reference in New Issue
Block a user