[Pharo-dev] Lock-free Atomic Counter ?

Igor Stasenko siguctua at gmail.com
Wed Apr 2 19:50:05 EDT 2014


extra note about yielding:
 - if i remember correctly, it yields on same priority level, letting other
process (if any)
at same priority level to take control.
and if there's none, then it is NOP.

so, if counter incr. used by processes with different priority it is better
to replace it with 1 ms sleep. or.... if you don't care, about busy
waiting.. you can just don't put anything :)



On 3 April 2014 01:34, Igor Stasenko <siguctua at gmail.com> wrote:

> so, lock-free counter can be something like:
>
> atomicIncr
> | oldValue |
>
> [
> oldValue := self atomicSwapCounterWithDummy.
> oldValue == dummy ] whileTrue: [ Processor yield ].
>
> ^ counter := oldValue + 1
>
>
> atomicSwapCounterWithDummy
> | old |
> old := counter.
> counter := dummy.
> ^ old
>
> so you use dummy to block anyone from setting the new value unless you set
> it.
> dummy can be any object (not a number in your care),
> and lastly, once you assign a new value, you effectively release a "lock"
> :)
>
> Processor yield is mainly attempt to avoid busy-waiting.
>
>
>
> On 3 April 2014 01:28, Igor Stasenko <siguctua at gmail.com> wrote:
>
>>
>>
>>
>> On 3 April 2014 00:11, Sven Van Caekenberghe <sven at stfx.eu> wrote:
>>
>>> Hi,
>>>
>>> Is it possible to have a simple lock-free atomic counter in Pharo 3.0 ?
>>>
>>> nextId
>>>   ^ idCounter := idCounter + 1
>>>
>>> Or is it still possible that two process entering this code can mess
>>> things up ?
>>>
>>> #+ is a message send. So technically, if you will be interrupted at the
>> point of
>> returning a result from it, then somebody else could run #nextId without
>> notice,
>> as result you will get 2 processes returning same value from #nextId.
>> (and increasing numbers of concurrent processes will produce even more
>> surprising results :)
>>
>>
>>> I vaguely remember a discussion about that long ago...
>>>
>>> assignment is atomic.. the one which i use in atomic queue impl., but it
>> is hidden, undocumented VM implementation detail :) e.g.:
>>
>> oldA := a.
>> a := newA.
>> ..
>> actually can be any series of it, as long as nothing else there (no
>> message sends)
>>
>> x:= a.
>> y:=b.
>> z := c.
>> w := e.
>>
>> will be performed atomically.
>>
>>
>>
>>> TIA,
>>>
>>> Sven
>>>
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko.
>>
>
>
>
> --
> Best regards,
> Igor Stasenko.
>



-- 
Best regards,
Igor Stasenko.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20140403/e52dcd9c/attachment-0002.html>


More information about the Pharo-dev mailing list