pass array of objects to spawn

Timon Gehr timon.gehr at gmx.ch
Thu Nov 10 13:23:01 PST 2011


On 11/10/2011 10:06 PM, Ruslan Mullakhmetov wrote:
> Hi folks,
>
> I need to create thread and pass to it array of objects wich will no
> longer use in main thread.
>
> The problem is that spawn only accepts immutables and i have no idea how
> to tell him that i transfer full ownership of the data to child thread.
>
> the code:
>
> import std.concurrency;
>
> class Foo
> {
>
> }
>
> void worker( Foo[] data )
> {
> //...
> }
>
> void main()
> {
> auto data = new Foo[10];
> spawn( &worker, data );
> }
>
>
> P.S. I do need to create data in main thread and distribute it to child
> threads.
>

There is no checkable type safe way to do this (because the type system 
is not powerful enough). You have to use type casts and work for the 
correctness guarantees yourself:


class Foo
{

}

void worker( shared(Foo[]) data_ )
{
     Foo[] data = cast() data_; // this cast is valid because data_ is 
never read from another thread after the cast
     //...
}

void main()
{
     {
         auto data = new Foo[10];
         spawn( &worker, cast(shared)data ); // this cast is valid 
because data is an unique reference (therefore there are no unshared 
aliases)
     } // the sole reference to data in the main thread dies -> it will 
never be read from this thread again
}





More information about the Digitalmars-d-learn mailing list