[fpc-pascal] Re: Semaphore problems
    Vinzent Hoefler 
    JeLlyFish.software at gmx.net
       
    Mon Jul 24 15:57:33 CEST 2006
    
    
  
On Monday 24 July 2006 10:21, Graeme Geldenhuys wrote:
> procedure TtiPool.CreatePoolSemaphore;
> begin
>   {$IFDEF MSWINDOWS}
>   if FSemaphore <> 0 then
>     CloseHandle( FSemaphore ) ;
>   FSemaphore := CreateSemaphore( nil, FiMaxPoolSize, FiMaxPoolSize,
> nil ); {$ENDIF MSWINDOWS}
>   {$IFDEF LINUX}
>   sem_destroy( FSemaphore );
>
>   if sem_init(FSemaphore, 0, 1) <> 0 then
>     raise Exception.Create('Failed to create the semaphore');
>   {$ENDIF LINUX}
> end;
What is FiMaxPoolSize? I assume, it's something like a number of request 
being allowed inside the semaphore-protected region at once?
So in the linux version only one thread is allowed being there.
I suppose you wrote something like
|for i := 0 to 9 do
|begin
|   Lock;
|   WriteLn ('Ping');
|end {for};
|
|for i := 0 to 9 do
|begin
|   WriteLn ('Pong');
|   Unlock;
|end {for};
In that case you're experiencing the lock-up when the semaphore is being 
"entered"/locked the second time inside your loop. The counter is zero 
after the first sem_wait and remains that way, because there's nobody 
there to call the sem_post() operation. Well, it may seen as a kind of 
a classical deadlock situation, although there's nothing classical in 
here. ;)
That's what you're experiencing. Although it might appear similar, a 
semaphore is *not* a mutex.
What I don't understand is why you don't use the "SyncObjs" unit where 
almost all the stuff someone ever needs is nicely laid out in a 
portable and object-oriented way.
> >   if sem_wait(FSemaphore) <> 0 then
> >     raise
> > EtiOPFInternalException.Create(cErrorTimedOutWaitingForSemaphore);
BTW, sem_wait() never returns anything else than zero, so checking is 
sort of useless here. There's sem_trywait() for that, if you really 
need to go so low-level.
To the question, what are semaphores. It's quite easily explained: 
Atomic counters, you can only get past if they're non-zero and in that 
case the counter is decremented.
Vinzent.
    
    
More information about the fpc-pascal
mailing list