If you could make any changes to D, what would they look like?

Ola Fosheim Grøstad ola.fosheim.grostad at gmail.com
Mon Oct 25 20:12:04 UTC 2021


On Monday, 25 October 2021 at 19:52:10 UTC, Paul Backus wrote:
> It can be assumed not to cause a data race, which means that an 
> atomic operation on a `shared` variable is exactly as safe as 
> the corresponding non-atomic operation on a thread-local 
> variable.

Of course it can't. Let take the simplest of the simple; a struct 
with a date with 3 fields_ day, month and year. Now, let us 
assume "2021-10-31". And then we add one day using atomics? How?

If I declare something as shared as a type, then I expect some 
solid means to protect it.

The current setup is too naive to be useful. It is no better than 
a wrapper-template. It does not need to implemented in the type 
system. It could have been implemented as a regular library.

This is not to say that the concept of "shared" is not useful. It 
is the might-as-well-have-been-a-template-wrapper-approach that 
is useless.

> [The language spec][1] defines "thread local" as follows:
>
>> *Thread-local memory locations* are accessible from only one 
>> thread at a time.

That is way too weak to get the benefits that are desirable, 
meaning: a competitive edge over C++.

I can create a template-wrapper in C++ too. So, as is, "shared" 
provides no advantage as far as I can tell.

> And further clarifies that
>
>> A memory location can be temporarily transferred from shared 
>> to local if synchronization is used to prevent any other 
>> threads from accessing the memory location during the 
>> operation.
>
> Of course, the compiler will not stop you from writing 
> incorrect casts in `@system` code, but that's not an issue 
> unique to `shared`.


I don't see how this can be guaranteed. The compiler _needs_ to 
know where the line in the sand is drawn so that is isn't limited 
by the potentially performance-limiting sequencing points that 
C++ has to deal with.

For instance: what are the lifetimes for cached computations when 
you don't know if another thread will obtain access to what you 
received as a "nonshared object"?

Also, in order to get solid GC performance the compiler needs to 
know whether the memory is owned by the thread or is foreign to 
it.

"shared" has to be more than a shell in order to enable more 
"power"...




More information about the Digitalmars-d mailing list