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.