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 <siguc...@gmail.com> wrote:

>
>
>
> On 3 April 2014 00:11, Sven Van Caekenberghe <s...@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.

Reply via email to