Martin 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