4600-project-1
Project 1 for 4600
I got a grade of 101.5% :D
Please ensure you've read and agree to abide by the license before continuing.
This software's source code was made public under a restrictive license with the intent to allow comparison of Project 1 solutions with other former course-members and members of the general public. I'm not liable for any academic stupidity that may result from attempted plagiarism of this work.
You have been warned.
Build
Build with make
Run with make run
Clean with make clean
Explanation of Solution
Counting Semaphores:
This project uses four counting semaphores:
-
sem_freelisttracks the number of blocks on thefreelist.- This prevents any thread from trying to read a nonexistent (
nullptr) block from thefreelist.
- This prevents any thread from trying to read a nonexistent (
-
sem_freelist_minus_1tracks the number of blocks on thefreelistminus 1:- This is used to circumvent a deadlock situation where Thread-1 (the producer) will eat the last block on the
freelistand put it onlist1, where Thread-2 (the transformer) will never be able to consume it, since it's blocked on the emptyfreelist. - 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()andsignal().
- This is used to circumvent a deadlock situation where Thread-1 (the producer) will eat the last block on the
-
sem_list1tracks the number of blocks onlist1.- This prevents any thread from trying to read a nonexistent (
nullptr) block fromlist1.
- This prevents any thread from trying to read a nonexistent (
-
sem_list2tracks the number of blocks onlist2.- This prevents any thread from trying to read a nonexistent (
nullptr) block fromlist2.
- This prevents any thread from trying to read a nonexistent (
All counting semaphores were used for thread synchronization.
Binary Semaphores:
This project uses three binary semaphores:
-
sem_freelistguarantees mutual exclusion when accessing thefreelist.- This prevents memory corruption, as list accesses are thread-unsafe.
-
sem_list1guarantees mutual exclusion when accessinglist1.- This prevents memory corruption, as list accesses are thread-unsafe.
-
sem_list2guarantees mutual exclusion when accessinglist2.- This prevents memory corruption, as list accesses are thread-unsafe.
All binary semaphores were used for mutual exclusion.