On 2013-10-10 09:33, Jonathan M Davis wrote:

You might do that if you're creating the object simply to send it across, but
it's frequently the case that the object was created well before it was sent
across, and it frequently had to have operations done it other than simply
creating it (which wouldn't work if it were shared). So, it often wouldn't
make sense for the object being passed to be shared except when being passed.

I guess if you're not creating it as "shared" to being with there's not way to tell that the given object now is shared an no thread local references are allowed.

And once it's been passed, it's rarely the case that you want it to be shared.
You're usually passing ownership. You're essentially taking a thread-local
variable from one thread and making it a thread-local variable on another
thread. Unfortunately, the type system does not support the concept of thread
ownership (beyond thread-local vs shared), so it's up to the programmer to
make sure that no references to the object are kept on the original thread,
but there's really no way around that unless you're always creating a new
object when you pass it across, which would result in which would usually be a
unnecessary copy. So, it becomes like @trusted in that sense.

It sounds like we need a way to transfer ownership of an object to a different thread.

I honestly don't think we can solve it a different way without completely
redesigning shared. shared is specifically designed such that you have to
either cast it way to do anything with it or write all of your code to
explicitly work with shared, which is not something that generally makes sense
to do unless you're creating a type whose only value is in being shared across
threads. Far more frequently, you want to share a type which you would also
use normally as a thread-local variable, and that means casting.

I guess it wouldn't be possible to solve it without changing the type system.

--
/Jacob Carlborg

Reply via email to