[fpc-pascal] Semaphore problems
Burkhard Carstens
fpc at bcsoft.de
Mon Jul 24 19:51:46 CEST 2006
Am Montag, 24. Juli 2006 19:22 schrieb Vinzent Höfler:
> Burkhard Carstens wrote:
> > Am Montag, 24. Juli 2006 17:27 schrieb Vinzent Hoefler:
> >>> - the rtlEvent works even with timeout (with my patch posted on
> >>> mantis), but this one clears the signaled state, when wait is
> >>> called.
> >>
> >> *oh* Before the wait? That's not good. This cries for race
> >> conditions and subtle deadlock situations.
> >
> > thread synchronization uses this and takes care of it by calling
> > RTLeventstartwait which locks the associated mutex.
>
> As far as I just read code and comments, it does it for Windows to
> get Unix behaviour, although I don't see the point here, because this
> just forces the race condition the POSIX-Threads implementation
> actually tries to circumvent with this associated mutex.
I don't think so. In unix, the mutex is locked, which ensures, there is
not setevent between startwait and actual call to wait, because the
call to wait seems to reset the cond, then releases the mutex and
starts waiting. In windows, this doesn't matter (resetting the event on
startwait), because it preserves the signaled state of the event. The
wait call just returns immediately, if the event is allready signaled.
To me, this is fine. As long as rtlevent is used with this in mind, it
should give a consistent behaviour on windows and linux. (see
classes.inc thread synchronization)
> I'm not even sure, if Unix actually clears the event. The man-pages
> don't seem to indicate so.
It does, at least with the timedwait. I tested that extensively.
Burkhard
More information about the fpc-pascal
mailing list