Something needs to happen with shared, and soon.

Jonathan M Davis jmdavisProg at gmx.com
Tue Nov 13 19:38:48 PST 2012


On Tuesday, November 13, 2012 14:33:50 Andrei Alexandrescu wrote:
> As long as a cast is required along the way, we can't claim victory. I
> need to think about that scenario.

At this point, I don't see how it could be otherwise. Having the shared 
equivalent of const would just lead to that being used everywhere and defeat 
the purpose of shared in the first place. If it's not segregated, it's not 
doing its job. But that leaves us with most functions not working with shared, 
which is also a problem. Templates are a partial solution, but they obviously 
don't work for everything.

In general, I would expect that all uses of shared would be protected by a 
mutex or synchronized block or other similar construct. It's just going to 
cause problems to do otherwise. There are some cases where if you can 
guarantee that writes and reads are atomic, you're fine skipping the mutexes, 
but those are relatively rare, particularly when you consider the issues in 
making anything but extremely trivial writes or reads atomic.

That being the case, it doesn't really seem all that unreasonable to me for it 
to be normal to have to cast shared to non-shared to pass to functions as long 
as all of that code is protected with a mutex or another, similar construct - 
though if those functions aren't pure, you _could_ run into entertaining 
problems when a non-shared reference to the data gets wiled away somewhere in 
those function calls.

But we seem to have contradictory requirements here of trying to segregate 
shared from normal, thread-local stuff but are still looking to be able to use 
shared with functions intended to be used with non-shared stuff.

- Jonathan M Davis


More information about the Digitalmars-d mailing list