[fpc-pascal] threads, memory barriers and RTLeventSetEvent / RTLeventWaitFor
Martin
fpc at mfriebe.de
Tue Oct 1 17:06:53 CEST 2019
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;
More information about the fpc-pascal
mailing list