Primitive thread-safe, shared queue.
Note that when using this queue, there is no way for the producer to signal that he is done. A consequence is that this queue structure should only be used when consumers are continually looping and waiting for work to be added to the queue.
This is appropriate, for instance, for the client handler threads that always wait on the incoming connections queue for a new client to connect, and for the loader thread that is always and forever waiting to be told to load new models.