Solve the problem (+1)!

This commit is contained in:
John 2022-04-05 23:15:51 -05:00
parent 05cd1033cd
commit ff108dcd0b
5 changed files with 41 additions and 16 deletions

View File

@ -17,6 +17,6 @@ extern list lists[3];
extern list *freelist, *list1, *list2; extern list *freelist, *list1, *list2;
// count semaphores // count semaphores
extern sem_t sem_freelist, sem_list1, sem_list2; extern sem_t sem_freelist, sem_list1, sem_list2, sem_freelist_minus_1;
// binary semaphores // binary semaphores
extern sem_t mut_freelist, mut_list1, mut_list2; extern sem_t mut_freelist, mut_list1, mut_list2;

View File

@ -9,19 +9,27 @@ int consume(block* c);
void *consumer (void *) { void *consumer (void *) {
block* c; block* c;
while (true) { while (true) {
// wait for element on list2
wait(sem_list2); wait(sem_list2);
// mutual exclusion for list2
wait(mut_list2); wait(mut_list2);
//* c:=unlink(list-2); //* c:=unlink(list-2);
c = unlink(list2); c = unlink(list2);
// mutual exclusion for list2
signal(mut_list2); signal(mut_list2);
//* consume_information_in_block(c) //* consume_information_in_block(c)
consume(c); consume(c);
// mutual exclusion for freelist
wait(mut_freelist); wait(mut_freelist);
//* link(c, freelist) //* link(c, freelist)
link(c, freelist); link(c, freelist);
// mutual exclusion for freelist
signal(mut_freelist); signal(mut_freelist);
// signal thread-1 to continue
signal(sem_freelist_minus_1);
// signal new element on freelist
signal(sem_freelist); signal(sem_freelist);
} }
@ -29,5 +37,5 @@ void *consumer (void *) {
} }
int consume(block *c) { int consume(block *c) {
return c->data; return 0;
} }

View File

@ -16,11 +16,9 @@ list lists[3] = {0};
list *freelist = &lists[0], *list1 = &lists[1], *list2 = &lists[2]; list *freelist = &lists[0], *list1 = &lists[1], *list2 = &lists[2];
// count semaphores // count semaphores
sem_t sem_freelist, sem_list1, sem_list2; sem_t sem_freelist, sem_freelist_minus_1, sem_list1, sem_list2;
// binary semaphores // binary semaphores
sem_t mut_freelist, mut_list1, mut_list2; sem_t mut_freelist, mut_list1, mut_list2;
// binary semaphores for reading/writing
sem_t mut_take, mut_give;
int main (int argc, char* argv[]) { int main (int argc, char* argv[]) {
// initialize the freelist // initialize the freelist
@ -29,6 +27,7 @@ int main (int argc, char* argv[]) {
//TODO: Implement a semaphore solution to the problem //TODO: Implement a semaphore solution to the problem
// counting semaphores measure the length // counting semaphores measure the length
sem_init(&sem_freelist, 0, freelist->length); sem_init(&sem_freelist, 0, freelist->length);
sem_init(&sem_freelist_minus_1, 0, freelist->length-1);
sem_init(&sem_list1, 0, 0); sem_init(&sem_list1, 0, 0);
sem_init(&sem_list2, 0, 0); sem_init(&sem_list2, 0, 0);
// binary semaphores create mutual exclusion // binary semaphores create mutual exclusion

View File

@ -8,24 +8,29 @@ void produce(block* b);
void *producer (void *) { void *producer (void *) {
block *b; block *b;
while (true) while (true) {
{ // wait for >1 block on freelist
int v; wait(sem_freelist_minus_1);
while(sem_getvalue(&sem_freelist, &v), v <= 1); // wait for element on freelist
wait(sem_freelist); // wait for freelist not empty wait(sem_freelist);
wait(mut_freelist); // lock freelist // mutual exclusion for freelist
wait(mut_freelist);
//* b:= unlink(freelist); //* b:= unlink(freelist);
b = unlink(freelist); b = unlink(freelist);
signal(mut_freelist); // unlock freelist // mutual exclusion for freelist
signal(mut_freelist);
//* produce_information_in_block(b) //* produce_information_in_block(b)
produce(b); produce(b);
wait(mut_list1); // lock mutex // mutual exclusion for list1
wait(mut_list1);
//* link(b, list1); //* link(b, list1);
link(b, list1); link(b, list1);
signal(mut_list1); // unlock mutex // mutual exclusion for list1
signal(sem_list1); // signal new item on list signal(mut_list1);
// signal new element on list1
signal(sem_list1);
} }
return nullptr; return nullptr;
} }

View File

@ -9,31 +9,43 @@ void transform(block* x, block* y);
void *transformer (void *) { void *transformer (void *) {
block *x, *y; block *x, *y;
while (true) { while (true) {
// wait for element on list1
wait(sem_list1); wait(sem_list1);
wait(sem_freelist); // mutual exclusion for list1
wait(mut_list1); wait(mut_list1);
//* x:=unlink(list1); //* x:=unlink(list1);
x = unlink(list1); x = unlink(list1);
// mutual exclusion for list1
signal(mut_list1); signal(mut_list1);
// wait for element on freelist
wait(sem_freelist);
// mutual exclusion for freelist
wait(mut_freelist); wait(mut_freelist);
//* y:=unlink(freelist); //* y:=unlink(freelist);
y = unlink(freelist); y = unlink(freelist);
// mutual exclusion for freelist
signal(mut_freelist); signal(mut_freelist);
//* use_block_x_to_produce_info_in_y(x,y) //* use_block_x_to_produce_info_in_y(x,y)
transform(x, y); transform(x, y);
// mutual exclusion for freelist
wait(mut_freelist); wait(mut_freelist);
//* link(x, freelist); //* link(x, freelist);
link(x, freelist); link(x, freelist);
// mutual exclusion for freelist
signal(mut_freelist); signal(mut_freelist);
// freelist++
signal(sem_freelist); signal(sem_freelist);
// mutual exclusion for list2
wait(mut_list2); wait(mut_list2);
//* link(y, list2); //* link(y, list2);
link(y, list2); link(y, list2);
// mutual exclusion for list2
signal(mut_list2); signal(mut_list2);
// signal new element on list2
signal(sem_list2); signal(sem_list2);
} }
@ -41,5 +53,6 @@ void *transformer (void *) {
} }
void transform(block *x, block *y) { void transform(block *x, block *y) {
usleep(timescale);
return; return;
} }