29.06.2011 18:31, Michael Schnell:
[...]
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.
I think this code will work fine (at least on win32) because your main
thread issues Sleep() and (implicitely) ResumeThread(), and your worker
thread issues Sleep() and (implicitely) SuspendThread(). I somehow doubt
that passing these system calls could let something remain unflushed in
the cache, as the OS will most probably have to do some synchronization
inside these calls for internal bookkeeping, but this is IMHO kind of
side-effect.
If it was my program I'd use critical section explicitely anyway to be
sure.
Nikolai
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
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel