I don't claim to understand what all this is doing but consider these lines:
e = fq->front();
What happens if the the queue is not empty when the condition is tested but it is empty before the lock is asserted?
This can happen which is the same as to say it will happen. Perhaps you need to move the lock before the check or redo the check inside the lock?