Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2019-10

threads, memory barriers and RTLeventSetEvent / RTLeventWaitFor

3 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Martin

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;

Reply by email

Sven Barth
to Martin

Martin schrieb am Di., 1. Okt. 2019, 17:19:

Show quoted text 48 lines
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

Reply by email

Jonas Maebe
to Sven Barth
Sven Barth wrote 10 lines
Martin < > schrieb am Di., 1. Okt. 2019, 17:19: Therefore my question: Does RTLeventSetEvent / RTLeventWaitFor make sure memory is synchronized between threads? The functions themselves AFAIK don't have any memory barriers, so it would depend solely on the OS primitives. 

The used OS-primitives do contain memory barriers (at least on Unix platforms, but I would assume everywhere).

Jonas

Reply by email