diff --git a/README.md b/README.md index a8a0be4..0b77031 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,47 @@ # 4600-project-1 -Project 1 for CSCE4600 \ No newline at end of file +Project 1 for CSCE4600, for Team G4 + +## Build + +Build with `make` + +Run with `make run` + +Clean with `make clean` + +## Explanation of Solution + +### Counting Semaphores: + +This project uses four counting semaphores: + +* `sem_freelist` tracks the number of blocks on the `freelist`. + * This prevents any thread from trying to read a nonexistent (`nullptr`) block from the `freelist`. + +* `sem_freelist_minus_1` tracks the number of blocks on the `freelist` minus 1: + * This is used to circumvent a deadlock situation where Thread-1 (the producer) will eat the last block on the `freelist` and put it on `list1`, where Thread-2 (the transformer) will never be able to consume it, since it's blocked on the empty `freelist`. + * Without this, you'd need to check that `sem_freelist > 1`, and the project specifications only allow the use of P() and V(), A.K.A. `wait()` and `signal()`. + +* `sem_list1` tracks the number of blocks on `list1`. + * This prevents any thread from trying to read a nonexistent (`nullptr`) block from `list1`. + +* `sem_list2` tracks the number of blocks on `list2`. + * This prevents any thread from trying to read a nonexistent (`nullptr`) block from `list2`. + +All counting semaphores were used for thread synchronization. + +### Binary Semaphores: + +This project uses three binary semaphores: + +* `sem_freelist` guarantees mutual exclusion when accessing the `freelist`. + * This prevents memory corruption, as list accesses are thread-unsafe. + +* `sem_list1` guarantees mutual exclusion when accessing `list1`. + * This prevents memory corruption, as list accesses are thread-unsafe. + +* `sem_list2` guarantees mutual exclusion when accessing `list2`. + * This prevents memory corruption, as list accesses are thread-unsafe. + +All binary semaphores were used for mutual exclusion. \ No newline at end of file