Francois Piette wrote:
> This raise the following question : Is a field variable in a class
> aligned in memory ? (OnMyEvent variable is just a field variable).

Isn't a field "properly aligned in memory" when switch {$A8} is set?

---
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html


> --
> [EMAIL PROTECTED]
> http://www.overbyte.be
> 
> ----- Original Message -----
> From: "Arno Garrels" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <twsocket@elists.org>
> Sent: Monday, August 07, 2006 11:27 AM
> Subject: Re: [twsocket] Interesting
> multithreadingissue:raceconditionwhentriggering an event handler
> 
> 
>> Francois Piette wrote:
>>>> This requires atomic reading/writing of a Pointer (no thread switch
>>>> while read/write), I'm not sure whether this is true.
>>> 
>>> I think so since pointer are 32 bits and are accessed by only one
>>> memory cycle. If you look at the Windows API InterlockedXYZ
>>> function, there is none to access a single 32 bit value. So I guess
>>> it is guaranteed to have a 32 bit access done in one chunk.
>> 
>> In order to clear myself up finally I goggled a bit and found this:
>> 
>> http://windowssdk.msdn.microsoft.com/en-us/library/ms684122.aspx
>> 
>> "Simple reads and writes to properly-aligned 32-bit variables are
>> atomic. 
> In other words, when one thread is updating a 32-bit variable, you
> will not end up with only one portion of the variable updated; all 32
> bits are updated in an atomic fashion. However, access is not
> guaranteed to be synchronized. If two threads are reading and writing
> from the same variable, you cannot determine if one thread will
> perform its read operation before the other performs its write
> operation. 
>> Simple reads and writes to properly aligned 64-bit variables are
>> atomic on 
> 64-bit Windows. Reads and writes to 64-bit values are not guaranteed
> to be atomic on 32-bit Windows. Reads and writes to variables of
> other sizes are not guaranteed to be atomic on any platform."
>> 
>> But is this also true for Unix OS? Some articles I found say that
>> atomicity is garanteed up to native int only.
>> 
>> ---
>> Arno Garrels [TeamICS]
>> http://www.overbyte.be/eng/overbyte/teamics.html
>> 
>> 
>>> 
>>> Contribute to the SSL Effort. Visit
>>> http://www.overbyte.be/eng/ssl.html --
>>> [EMAIL PROTECTED]
>>> Author of ICS (Internet Component Suite, freeware)
>>> Author of MidWare (Multi-tier framework, freeware)
>>> http://www.overbyte.be
>>> 
>>> 
>>> ----- Original Message -----
>>> From: "Arno Garrels" <[EMAIL PROTECTED]>
>>> To: "ICS support mailing" <twsocket@elists.org>
>>> Sent: Monday, August 07, 2006 9:35 AM
>>> Subject: Re: [twsocket] Interesting multithreading issue:
>>> raceconditionwhentriggering an event handler
>>> 
>>> 
>>>> Arno Garrels wrote:
>>>>> Francois PIETTE wrote:
>>>>>> I've found an interesting multithreading issue which is related
>>>>>> not The solution is to rewrite the procedure as follow:
>>>>>> 
>>>>>> Line1: procedure TMyComponent.TriggerMyEvent(MyArg : Integer);
>>>>>> Line2: var
>>>>>> Line3:     TMyEventProc EventProc;
>>>>>> Line4: begin
>>>>>> Line5:     EventProc := OnMyEvent;
>>>>>> Line6:     if Assigned(EventProc) then
>>>>>> Line7:         EventProc(Self, MyArg);
>>>>>> Line8: end;
>>>>>> Saving the event pointer in line5 make sure that it is still
>>>>>> valid in the case a thread switch between Line 6 and 7 occur and
>>>>>> the OnMyEvent is set to nil by the other thread.
>>>>>> 
>>>>>> Interesting, isn't it ?
>>>>> 
>>>>> I think it's better/faster than having critical sections for all
>>>>> triggers, do you plan to change all ICS triggers accordingly?
>>>> 
>>>> This requires atomic reading/writing of a Pointer (no thread switch
>>>> while read/write), I'm not sure whether this is true. Byte
>>>> variables are written/read in one go, there's no ploblem.
>>>> 
>>>> ---
>>>> Arno Garrels [TeamICS]
>>>> http://www.overbyte.be/eng/overbyte/teamics.html
>>>> 
>>>> 
>>>> --
>>>> To unsubscribe or change your settings for TWSocket mailing list
>>>> please goto http://www.elists.org/mailman/listinfo/twsocket
>>>> Visit our website at http://www.overbyte.be
>> --
>> To unsubscribe or change your settings for TWSocket mailing list
>> please goto http://www.elists.org/mailman/listinfo/twsocket
>> Visit our website at http://www.overbyte.be
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to