[fpc-devel] volatile variables
Nikolai Zhubr
n-a-zhubr at yandex.ru
Wed Jun 29 17:29:44 CEST 2011
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 at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>
>
More information about the fpc-devel
mailing list