Fixing core.atomic

rm rymrg at memail.com
Wed Jun 2 14:50:44 UTC 2021


On 01/06/2021 5:50, sarn wrote:
> On Sunday, 30 May 2021 at 20:58:56 UTC, IGotD- wrote:
>> Definitely, the D atomic library is cumbersome to use. C++ std::atomic 
>> supports operator overloading for example.
>>
>> atomicVar += 1;
>>
>> will create an atomic add as atomicVar is of the atomic type. D 
>> doesn't have this and I think D should add atomic types like 
>> std::atomic<T>.
> 
> That was a design choice.  It's because of this:
> 
>> I like this because then I can easily switch between atomic operations 
>> and normal operations by just changing the type and very few changes.
> 
> The trouble is that only works in a handful of simple cases (e.g., you 
> just want a simple event counter that doesn't affect flow of control).  
> For anything else, you need to think carefully about exactly where the 
> atomic operations are, so there's no point making them implicit.

I agree about that. One shouldn't simply access the same memory location 
atomically and non-atomically interchangeably. That is a source for many 
bugs. Especially considering the kind of synchronization you'll have or 
not have as a result.

Still, there are cases where you *know* that your thread is the *only 
one* that can access this variable. In a case like this, only after you 
made sure to synchronize you can also allow for non atomic access to the 
variable (Though I'd still avoid this).
Alternatively, the other case is going from non-atomic to atomic. After 
initializing the location with an allocator in a non atomic manner, you 
move to use it atomically to synchronize between threads.

But regarding the design choice, if your intention is to prevent casting 
the atomic to non-atomic. You can simply wrap it in a struct and not 
allowing access to the raw value. That should be sufficient.

Anyway, I disagree about the simple cases. Because specifically the case 
of simple event counter that isn't require for synchronization, you 
should be using relaxed. There is no need for sequential consistency in 
this case.


More information about the Digitalmars-d mailing list