Martin <f...@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

>
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to