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