[fpc-pascal] threads, memory barriers and RTLeventSetEvent / RTLeventWaitFor

Sven Barth pascaldragon at googlemail.com
Tue Oct 1 20:48:06 CEST 2019


Martin <fpc at mfriebe.de> schrieb am Di., 1. Okt. 2019, 17:19:

> I am currently looking at a strange issue in FpDebug.
>
> The main thread loads a lot of data from a file, and creates various
> objects.
>
> Then some code is executed in a sub-thread. The timing of that
> (start/stop of the 2 threads) is handled by RTLeventSetEvent /
> RTLeventWaitFor.
> This code does not seem to find (some of/ all?) the data. (for
> comparison, on windows the same code continues to run in the main
> thread, and finds the data).
>
> So the suspicion arises that maybe the thread has older data cached?
>
> Therefore my question:
> Does RTLeventSetEvent / RTLeventWaitFor make sure memory is synchronized
> between threads?
>
> //MAIN thread
> procedure TFpDebugDebugger.ExecuteInDebugThread(AMethod:
> TFpDbgAsyncMethod);
> begin
>    assert(not assigned(FFpDebugThread.AsyncMethod));
>    FFpDebugThread.AsyncMethod:=AMethod;
>    RTLeventSetEvent(FFpDebugThread.StartDebugLoopEvent);
>    RTLeventWaitFor(FFpDebugThread.DebugLoopStoppedEvent);
>    RTLeventResetEvent(FFpDebugThread.DebugLoopStoppedEvent);
>    FFpDebugThread.AsyncMethod:=nil;
> end;
>
> // OTHER thread
> procedure TFpDebugThread.Execute;
> begin
> ...
>      repeat
>      RTLeventWaitFor(FStartDebugLoopEvent);
>      RTLeventResetEvent(FStartDebugLoopEvent);
>        if assigned(FAsyncMethod) then
>          begin
>          try
>            FAsyncMethod();
>          finally
>            RTLeventSetEvent(FDebugLoopStoppedEvent);
>          end;
>          end;
>      until Terminated;
> end;
>

The functions themselves AFAIK don't have any memory barriers, so it would
depend solely on the OS primitives.

Regards,
Sven

>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20191001/6e592061/attachment.html>


More information about the fpc-pascal mailing list