On 06/29/2011 03:17 PM, Nikolai Zhubr wrote:

All places where any non-readonly data could be accessed by 2 or more threads should be protected. Thats it.
So this is not supposed to work:

Main thread:

  myThread := TmyThread.Create(True);
while not myThread.Suspended sleep(0); //give up time slice to allow the worker thread to start myList := TThreadlist.Create; // set the variable in cache 1
  myThread.Suspended := False;
sleep(100); // have the worker thread run
  ....


Worker Thread:

procedure TmyTherad.Execute;
begin
myList := NIL; // set the variable in the cache 2
  Suspended := True;
myList.Add(..... //has the variable been synchronized from the other cache ????


Here the variable myList is not protected.

As assigning a value to myList in one thread is only a very short time before the other thread reads it, it's very likely that the wrong value is still be in the cache of the worker thread's processor and make it crash.

But is is just a very extreme example of a behavior that mostly is assumed to work and according to your wording would be bound to fail.

-Michael
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to