Thread overview
is increment on shared ulong atomic operation?
Feb 07, 2016
Charles Hixson
Feb 07, 2016
rsw0x
Feb 07, 2016
rsw0x
Feb 07, 2016
Minas Mina
Feb 07, 2016
rsw0x
Feb 08, 2016
Andrea Fontana
Feb 08, 2016
Charles Hixson
February 07, 2016
If I define a shared ulong variable, is increment an atomic operation?
E.g.

shared ulong t;

...

t++;

It seems as if it ought to be, but it could be split into read, increment, store.

I started off defining a shared struct, but that seems silly, as if the operations defined within a shared struct are synced, then the operation on a shared variable should be synced, but "+=" is clearly stated not to be synchronized, so I'm uncertain.

February 07, 2016
On Sunday, 7 February 2016 at 19:27:19 UTC, Charles Hixson wrote:
> If I define a shared ulong variable, is increment an atomic operation?
> E.g.
>
> shared ulong t;
>
> ...
>
> t++;
>
> It seems as if it ought to be, but it could be split into read, increment, store.
>
> I started off defining a shared struct, but that seems silly, as if the operations defined within a shared struct are synced, then the operation on a shared variable should be synced, but "+=" is clearly stated not to be synchronized, so I'm uncertain.

https://dlang.org/phobos/core_atomic.html#.atomicOp
February 07, 2016
On Sunday, 7 February 2016 at 19:39:27 UTC, rsw0x wrote:
> On Sunday, 7 February 2016 at 19:27:19 UTC, Charles Hixson wrote:
>> If I define a shared ulong variable, is increment an atomic operation?
>> E.g.
>>
>> shared ulong t;
>>
>> ...
>>
>> t++;
>>
>> It seems as if it ought to be, but it could be split into read, increment, store.
>>
>> I started off defining a shared struct, but that seems silly, as if the operations defined within a shared struct are synced, then the operation on a shared variable should be synced, but "+=" is clearly stated not to be synchronized, so I'm uncertain.
>
> https://dlang.org/phobos/core_atomic.html#.atomicOp

Just noticed that there's no example.
It's used like

shared(ulong) a;
atomicOp!"+="(a, 1);
February 07, 2016
On Sunday, 7 February 2016 at 19:43:23 UTC, rsw0x wrote:
> On Sunday, 7 February 2016 at 19:39:27 UTC, rsw0x wrote:
>> On Sunday, 7 February 2016 at 19:27:19 UTC, Charles Hixson wrote:
>>> If I define a shared ulong variable, is increment an atomic operation?
>>> E.g.
>>>
>>> shared ulong t;
>>>
>>> ...
>>>
>>> t++;
>>>
>>> It seems as if it ought to be, but it could be split into read, increment, store.
>>>
>>> I started off defining a shared struct, but that seems silly, as if the operations defined within a shared struct are synced, then the operation on a shared variable should be synced, but "+=" is clearly stated not to be synchronized, so I'm uncertain.
>>
>> https://dlang.org/phobos/core_atomic.html#.atomicOp
>
> Just noticed that there's no example.
> It's used like
>
> shared(ulong) a;
> atomicOp!"+="(a, 1);

Wow, that syntax sucks a lot.
February 07, 2016
On Sunday, 7 February 2016 at 20:25:44 UTC, Minas Mina wrote:
> On Sunday, 7 February 2016 at 19:43:23 UTC, rsw0x wrote:
>> On Sunday, 7 February 2016 at 19:39:27 UTC, rsw0x wrote:
>>> On Sunday, 7 February 2016 at 19:27:19 UTC, Charles Hixson wrote:
>>>> [...]
>>>
>>> https://dlang.org/phobos/core_atomic.html#.atomicOp
>>
>> Just noticed that there's no example.
>> It's used like
>>
>> shared(ulong) a;
>> atomicOp!"+="(a, 1);
>
> Wow, that syntax sucks a lot.

how so?
It's meant to be very explicit
February 07, 2016
Thanks, that's what I needed to know.

I'm still going to do it as a class, but now only the inc routine needs to be handled specially.
(The class is so that other places where the value is used don't even need to know that it's special.  And so that instances are easy to share between threads.)

On 02/07/2016 11:43 AM, rsw0x via Digitalmars-d-learn wrote:
> On Sunday, 7 February 2016 at 19:39:27 UTC, rsw0x wrote:
>> On Sunday, 7 February 2016 at 19:27:19 UTC, Charles Hixson wrote:
>>> If I define a shared ulong variable, is increment an atomic operation?
>>> E.g.
>>>
>>> shared ulong t;
>>>
>>> ...
>>>
>>> t++;
>>>
>>> It seems as if it ought to be, but it could be split into read, increment, store.
>>>
>>> I started off defining a shared struct, but that seems silly, as if the operations defined within a shared struct are synced, then the operation on a shared variable should be synced, but "+=" is clearly stated not to be synchronized, so I'm uncertain.
>>
>> https://dlang.org/phobos/core_atomic.html#.atomicOp
>
> Just noticed that there's no example.
> It's used like
>
> shared(ulong) a;
> atomicOp!"+="(a, 1);
>

February 08, 2016
On Sunday, 7 February 2016 at 20:25:44 UTC, Minas Mina wrote:
>> Just noticed that there's no example.
>> It's used like
>>
>> shared(ulong) a;
>> atomicOp!"+="(a, 1);
>
> Wow, that syntax sucks a lot.


a.atomicOp!"+="(1);

sounds better. You can alias it too.