[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