On Tue, 19 Jul 2011 14:31:19 -0400, Jonathan M Davis <jmdavisp...@gmx.com> wrote:

On 2011-07-19 05:40, Steven Schveighoffer wrote:
On Mon, 18 Jul 2011 18:39:01 -0400, Jonathan M Davis I have to jump in and correct you, nobody else has.

You can also pass data marked as shared.

A solution could be to cast the class as shared, pass it, then cast it
back to unshared (ensuring you don't access the class from the originator
anymore).

This is not a compiler-enforced solution, but it gets the job done. But
there is risk of concurrency errors if you don't do it right. My
recommendation is to isolate the parts that create and pass the shared
data.

I thought that spawn and send disallowed shared and that you had to deal with
shared separately, but if that's not the case, then that's not the case.
Regardless, you can't just pass anything with spawn or send (as the OP seems
to be trying to do). They have restrictions to avoid concurrency bugs.

send requires the data pass this test:

!hasLocalAliasing!(T)

which maps to:

http://www.digitalmars.com/d/2.0/phobos/std_traits.html#hasUnsharedAliasing

So yes, you can pass shared data. However, there is still no sanctioned way to "pass and forget" mutable unique thread-local data. That is, you pass data to another thread, and it becomes local to that other thread instead of to the thread passed from.

You are correct that you can't just pass anything (i.e. thread-local mutable data), but in some cases, you have to force the issue. Just because the compiler can't prove it's valid doesn't mean it isn't. But it's definitely opening up a possibility for concurrency bugs.

-Steve

Reply via email to