I am supposed to implement a userlevel threads library in C. To do so, I need to implement yield()
, createThread()
and destroyThread()
functions. I believe I've got the basics right:
To keep track of threads, I'll use a queue of ThreadControlBlock
elements (which resemble PCBs in an OS) that look like this:
struct ThreadControlBlock {
int ThreadId,
u_context *context };
We can use the setcontext()
family of functions to "save" and "load" the context.
Upon initialization of the program, initialize ThreadQueue with no elements.
Now the part I am not getting: when a thread calls yield()
, I get the current context and save it in a ThreadControlBlock
and put in the queue. Then get the first element in the queue and load the context in it, and execution proceeds.
The question is, if I do this, say I am a thread calling yield()
and the next thread is myself. If I am saving the context and loading it again, upon re-entering wouldn't I be at the exact same spot where I was (before calling yield()
?) And this would keep going on forever?