
James Mansion wrote:
Ion Gaztañaga wrote:
A semaphore post only increases a waiting thread if count was 0. That's the behaviour of a semaphore. Not of Dijkstra's design it isn't. Conceptually a waiting consumer is immediately given the token and woken up, and further tokens will wake more consumers whether they are already waiting or not.
Looks like a bug to me.
My point is that (http://en.wikipedia.org/wiki/Semaphore_(programming)): P(Semaphore s) // Acquire Resource { wait until s > 0, then s := s-1; /* Testing and decrementing s must be atomic to avoid race conditions */ } V(Semaphore s) // Release Resource { s := s+1; /* must be atomic */ } P can only wake a single thread, because the semaphore count represents the free resource count. The original post said: "the post() unlocks only one of the 4 producers" and that's logical. If there are 4 waiting threads, you need 4 posts to unlock all. Best, Ion