$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [Interprocess::Semaphore] Deadlock on more producers - one consumer problem
From: James Mansion (james_at_[hidden])
Date: 2009-06-19 15:03:10
igaztanaga_at_[hidden] wrote:
> 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.
>
The post operation that 'wakes up' is V, not P.
If your api allows V(4) to release 4 resources atomically, then 4 
consumers in P must be released (if they are
waiting, and any left over accrued to allow future consumers not to 
block.  Even if you say V(4) is not supported
and actually V;V;V;V and these are atomic individually, then there is 
still a race between those four posts
and any Ps actually getting to run.  Either way, you MUST enable 4-off 
Ps to become ready.  If the API allows to
post multiple resources atomically, then you need to handle this.