Generally speaking, when you need to guarantee (say) FIFO-ordering, you should plan to implement that bit of it yourself.
For example, one way to solve this problem would be to devise a data-structure which contains a FIFO-queue and which happens to be protected by a semaphore. (Our clients will view this thing as an opaque "object," and I'm describing a possible implementation.)
We'll grab the semaphore to guarantee serial access to the object, and we'll see if the FIFO-queue is empty and the object is unowned. If so, we become the owner and we can just move right along... releasing the semaphore as we go. Otherwise, we need to arrange to wait. We add ourselves to the end of the FIFO-queue and go to sleep waiting for some user-signal after releasing the semaphore again.
As each client leaves the protected area, they grab the semaphore, and see if the queue is non-empty. If so, they pop the first guy off the queue, establish him as the new 'owner,' and send him a signal. Then, they release the semaphore and go about their business.