You will implement a simplified version of many-to-one user level threads in the form of a library called Simple Threads.
In the many-to-one model for user level threads, all threads execute on the same kernel thread. As there is only one kernel-level thread associated with the process (the process containing threads is represented by a single context within the kernel), only one user-level thread may run at a time.
The thread manager you will include a preemptive round-robin scheduler. If a thread does not yield during its time-slice, it will be preempted and one of the other ready threads will be resumed. The preempted and resumed threads should change state accordingly.
Note: You will NOT use pthreads in your implementation. The intent is to create similar functionality entirely in a user-space program.
You will implement thread synchronization and demonstrate that it works as expected. Implement the equivalent of mutex lock, mutex unlock, and join in your user threads (additional functions may be needed to complete these components; use your best judgement). You may use semaphores from semaphore.h, but NOT use the pthread library functions.
What to Turn In
A .tgz of your solution files. Design and usage notes should be included in a design.txt, also to be turned in via the .tgz archive. Design.txt should clearly state how and what you’ve done to convince yourself that your code works.