Proposal: Thread-sealed containers
Jason House
jason.james.house at gmail.com
Sat Mar 26 23:47:50 PDT 2011
dsimcha Wrote:
> I'm thinking about ways to make std.concurrency's model more flexible
> without compromising safety. It's sometimes useful to cheaply _move_
> (as opposed to share or copy) data between threads. I wonder if we
> could co-opt sealed containers here:
What definition of sealed are you using? A quick web search mostly brought up C#'s sealed keyword which I think is the same as D's final. I vaguely remember Andrei might have used the term to mean no aliases to the data held by the container?
> 1. Define basic data structures like arrays, hash tables and trees that
> are otherwise identical to sealed containers, but maintain a
> _thread-specific_ reference count. This can be naively implemented as a
> hash table with Thread keys and size_t values, but there's probably a
> better way. Provisionally call these "thread-sealed containers".
It might be possible to simply store the owning thread id. Since the thread that sent the container will still have a reference to it, you may be forced to do some extra runtime checks on every method call anyway...
> A thread-sealed container has the invariant that no two thread-specific
> reference counts may be simultaneously nonzero. If this becomes untrue,
> an Error is thrown at runtime. This is not as good as a compile time
> error, but it's much better than a low-level data race.
>
> 2. Restrict the contents of thread-sealed containers to types that can
> be safely shared/moved between threads: Primitives, shared and
> immutable data, and other thread-sealed containers.
Some kind of equivalent to assumeUnique may be needed here?
> 3. Define a std.concurrency.moveSend() function. This function takes a
> thread-sealed container by reference, decrements the sending thread's
> reference count, enforces that it's zero, then sends the container as a
> message to the receiving thread. The receiving thread increments its
> reference count of the container.
I like that you're thinking about this kind of stuff. I am over tired right now and haven't really thought this through, but it feels like this could lead to a major safety upgrade for std.concurrency.
More information about the Digitalmars-d
mailing list