Something needs to happen with shared, and soon.
nixda
nd at o.de
Sun Nov 11 17:30:23 PST 2012
drop it in favour of :
http://forum.dlang.org/post/k7j1ta$2kv8$1@digitalmars.com
On Sunday, 11 November 2012 at 18:46:12 UTC, Alex Rønne Petersen
wrote:
> Hi,
>
> It's starting to get outright embarrassing to talk to newcomers
> about D's concurrency support because the most fundamental part
> of it -- the shared type qualifier -- does not have
> well-defined semantics at all.
>
> I'm certainly not alone in being annoyed by this state of
> affairs: http://d.puremagic.com/issues/show_bug.cgi?id=8993
>
> I've posted rants about the state of shared before and, from
> the comments on those, it appears that what most people want
> shared to do is at least one (and usually multiple) of
>
> * make variables global (if appropriate in the context);
> * make the wrapped type completely separate from the unwrapped
> type;
> * make all operations be atomic;
> * make all operations result in memory barriers.
>
> At a glance, this looks fine. Exactly what you would want for
> shared types in a concurrent setting, right?
>
> Except, not really. I'll try to explain all of the unsolved
> problems with shared below...
>
> First of all, the fact that shared(T) is completely separate
> from T (i.e. no conversions allowed, except for primitive
> types) is a huge usability problem. In practice, it means that
> 99% of the standard library is unusable with shared types.
> Hell, even most of the runtime doesn't work with shared types.
> I don't know how to best solve this particular problem; I'm
> just pointing it out because anyone who tries to do anything
> non-trivial with shared will invariably run into this.
>
> Second, the idea of making shared insert atomic operations is
> an absolute fallacy. It only makes sense for primitive types
> for the most part, and even for those, what sizes are supported
> depends on the target architecture. A number of ideas have come
> up to solve this problem:
>
> * We make shared(T) not compile for certain Ts depending on the
> target architecture. I personally think this is a terrible idea
> because most code using shared will not be portable at all.
> * We require any architecture D targets to support atomic
> operations for a certain size S at the very least. This is fine
> for primitives up to 64 bits in size, but doesn't clear up the
> situation for larger types (real, complex types, cent/ucent,
> ...).
> * We make shared not insert atomic operations at all (thus
> making it kind of useless for anything but documentation).
> * (Possibly others I have forgotten; please let me know if this
> is the case.)
>
> I don't think any of these are particularly attractive, to be
> honest. If we do make shared insert atomic operations, we would
> also have to consider the memory ordering of those operations.
>
> Third, we have memory barriers. I strongly suspect that this is
> a misnomer in most cases where people have suggested this; it's
> generally not useful to have a compiler insert barriers because
> they are used to control ordering of load/store operations
> which is something the programmer will want to do explicitly.
> In any case, the compiler can't usefully figure out where to
> put barriers, so it would just result in really bad performance
> for no apparent gain.
>
> Fourth, there is implementation complexity. If shared is meant
> to insert specialized instructions, it will result in
> effectively two code paths for most code generation in any D
> compiler (read: maintenance nightmare).
>
> Fifth, it is completely unclear whether casting to and from
> shared is legal (but with a big fat "caution" sign like casting
> away const) or if it's undefined behavior. Making it undefined
> behavior would further increase the usability problem I
> described above.
>
> And finally, the worst part of all of this? People writing code
> that uses shared today are blindly assuming it actually does
> the right thing. It doesn't. Their code will break on any
> non-x86 platform. This is an absolutely horrifying situation
> now that ARM, MIPS, and PowerPC are starting to become viable
> targets for D.
>
> Something needs to be done about shared. I don't know what, but
> the current situation is -- and I'm really not exaggerating
> here -- laughable. I think we either need to just make it
> perfectly clear that shared is for documentation purposes and
> nothing else, or, figure out an alternative system to shared,
> because I don't see shared actually being useful for real world
> work no matter what we do with it.
More information about the Digitalmars-d
mailing list