[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