std.concurrency.spawn does not accept delegates

Jonathan M Davis jmdavisProg at gmx.com
Mon Jul 18 11:14:45 PDT 2011


On 2011-07-18 10:54, Simen Kjaeraas wrote:
> On Mon, 18 Jul 2011 18:06:46 +0200, Jonathan M Davis <jmdavisProg at gmx.com>
> 
> wrote:
> > On Monday 18 July 2011 15:55:52 teo wrote:
> >> On Mon, 18 Jul 2011 10:26:27 -0400, Steven Schveighoffer wrote:
> >> > On Sun, 17 Jul 2011 15:29:02 -0400, teo <teo.ubuntu at yahoo.com> wrote:
> >> >> It looks like std.concurrency.spawn does not accept delegates. Is
> >> >> there
> >> >> any reason for that?
> >> > 
> >> > There is no type attached to the hidden 'this' pointer. So spawn
> >> 
> >> cannot
> >> 
> >> > guarantee it doesn't point to unshared data.
> >> > 
> >> > -Steve
> >> 
> >> Bad. I tried to pass as an argument a pointer to an instance of a class
> >> -
> >> a this pointer. That didn't work.
> > 
> > Only stuff that's immutable or implicitly convertible immutable can be
> > passed
> > across threads using spawn and send. Otherwise, there's a risk of it
> > ending up
> > getting altered by both threads (or altered by one when the other one is
> > using
> > at it). Sometimes, that can be a bit restrictive (particularly when you
> > _know_
> > that something isn't going to be altered by the thread sending it after
> > its
> > sent but the compiler doesn't), but it avoids all kinds of problems. If
> > you
> > want to send a class object across, then it needs to be immutable (which
> > tends
> > to be a bit of a pain to do for classes, since they need to have an
> > immutable
> > constructor, which is often a pain to do).
> 
> It could be that assumeUnique should handle this, by transforming the
> delegate into something spawn() and friends could handle.
> 
> Might be worth an enhancement request.

There have been discussions about how to do it in the past. Whether 
assumeUnique will work depends on whether casting to immutable(C) will work 
(where C is the class' type), and I don't know whether that cast will work or 
not. If it does, then assumeUnique will do it, since all it does is cast to 
immutable, but it's the sort of thing that requires language support. There 
_might_ be a way to solve the problem with some sort of Unique template that 
spawn and send knew about, but nothing of the sort has been done yet. But 
until a number of the issues with const and immutable in the compiler have 
been sorted out, that sort of thing would probably be problematic anyway.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list