inc | ||
src | ||
.gitignore | ||
LICENSE | ||
Makefile | ||
pseudocode.txt | ||
README.md |
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_freelist
tracks 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_1
tracks the number of blocks on thefreelist
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 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_list1
tracks 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_list2
tracks 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_freelist
guarantees mutual exclusion when accessing thefreelist
.- This prevents memory corruption, as list accesses are thread-unsafe.
-
sem_list1
guarantees mutual exclusion when accessinglist1
.- This prevents memory corruption, as list accesses are thread-unsafe.
-
sem_list2
guarantees mutual exclusion when accessinglist2
.- This prevents memory corruption, as list accesses are thread-unsafe.
All binary semaphores were used for mutual exclusion.