[fpc-pascal] Semaphore problems

Vinzent Hoefler JeLlyFish.software at gmx.net
Tue Jul 25 09:30:50 CEST 2006


On Tuesday 25 July 2006 06:40, Micha Nelissen wrote:
> Vinzent Höfler wrote:
> > because we assume it's non-recursive, that was the whole point. So
> > we should *first* check the count and then may lock/unlock the
> > mutex accordingly.
>
> Note that these two actions must be atomic.

Oh, really?

> This is what the TryLock is for.

No, that's what the "Owner_Check_Lock" in my posted code would be for in 
the first place. But you're right, TryLock makes it possibly easier to 
detect/handle failures.

So the code from 

>    // Now try locking the real mutex.

should actually be more like:

|    // First encounter? So lock it actually.
|    if self.Count = 0 then
|    begin
|       // This  should  *always*  succeed,  because  we're  the owning
|       // thread (we've just checked it, right?) and we didn't lock it
|       // yet according to "Count".
|       // Thinkable  ways  how this can fail is if somebody has direct
|       // access  to  the  actual  pthread  mutex  inside  here  or we
|       // fuc^Wmessed up the counter somehow ...
|       if pthread_mutex_trylock (self...) <> 0 then
|          // Our real mutex couldn't be locked!? This *is* strange.
|          exit (FAILURE);
|    end {if};
|
|    // Alright, we got it. Mutex is locked (or at least, it *should* be
|    // already), so count up.
|    self.Count := self.Count + 1;
|    self.Owner_Check.Unlock;
|    exit (SUCCESS);
    
A pthread_mutex_trylock alone wouldn't actually help on a non-recursive 
"real" mutex. Because: if it's already locked I still don't know if it 
belongs to the current thread, but precisely that knowledge is needed 
to implement the recursive one on top of a non-recursive.


Vinzent.




More information about the fpc-pascal mailing list