A few thoughts on std.allocator
Jonathan M Davis via Digitalmars-d
digitalmars-d at puremagic.com
Mon May 11 03:54:09 PDT 2015
On Sunday, 10 May 2015 at 09:50:00 UTC, Andrei Alexandrescu wrote:
> 3. Thread-local vs. shared objects
>
> Currently in D it's legal to allocate memory in one thread and
> deallocate it in another. (One simple way to look at it is
> casting to shared.) This has a large performance cost that only
> benefits very few actual cases.
>
> It follows that we need to change the notion that you first
> allocate memory and then brand it as shared. The "will be
> shared" knowledge must be present during allocation, and use
> different methods of allocation for the two cases.
As long as casting to or from shared really doesn't do anything
other than change how the type system treats that type, we can't
really assume much of anything with regards to where shared _or_
thread-local variables came from. Maybe it's still of benefit for
the allocator to know that it's going to be dealing with shared
as opposed to thread-local variables when doing the allocation,
but I don't see how we can get rid of the possibility of an
object being allocated on one thread and deallocated on another
without making major changes to shared - and std.concurrency
isn't going to work very well if we can't cast to and from shared
or immutable to pass objects across threads - not unless we add
some way to indicate in the type system that a variable is being
passed across threads.
It may very well be that we _need_ to change how shared is
treated by the language and runtime and how its plumbing works,
but as it stands, I don't see how we could possibly assume that
whether an object is created as shared or thread-local - or even
what thread it's created on - has much of anything to do with how
it's _actually_ going to be used. In _most_ cases, an object is
going to be used on the same thread that it's created on, and if
it were possible to create an object as shared directly (which it
usually isn't), then in most cases an object that was created as
thread-local would be destroyed on the thread that it's created
on, and an object created as shared would be used as shared and
destroy on who-knows-which thread, but because of both the
possibility and need to cast to and from shared to do anything
useful with shared as well as passing objects across threads, we
simply cannot assume anything about how an object will be used
based on whether it's constructed as shared or not or which
thread it's constructed on.
For any of that to change, shared needs to change.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list