www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Can the send function send an array?

reply Fox <linuxl4 sohu.com> writes:
// I am learning how to send and receive data. The following is 
my intention, but it cannot be compiled.
// aliases to mutable thread-local data not allowed, what does it 
mean? thank you.

I am learning how to send and receive. The following is my 
intention, but it cannot be compiled. Report
import std.concurrency;
import std.stdio;
import std.exception;

void main(){

         int N=5;
         int[] arr1= new int[N];
         for(int i; i<N; i++){ arr1[i]=i;}
         writeln("Main thread, msg= ", arr1);
         auto j=spawn(&fun);
         j.send(thisTid, arr1);   //error!
         enforce(receiveOnly!Tid() == j);

}

void fun(){

         auto msg5= receiveOnly!(Tid, int[])();
         writeln("child thread, msg= ", msg5[1]);
         msg5[0].send(thisTid);
}
Sep 10
parent reply Andy Valencia <dont spam.me> writes:
On Tuesday, 10 September 2024 at 13:14:05 UTC, Fox wrote:
 // I am learning how to send and receive data. The following is 
 my intention, but it cannot be compiled.
 // aliases to mutable thread-local data not allowed, what does 
 it mean? thank you.
dlang tries to use the type system to make one be clear about what data is shared between potentially concurrent threads. You need that data to be "shared" before you can send it between threads. Andy
Sep 10
parent Fox <linuxl4 sohu.com> writes:
OK, It works, thanks.

// dlang tries to use the type system to make one be clear about 
what data is shared between potentially concurrent threads.
// You need that data to be "shared" before you can send it 
between threads.
// Andy

import std.concurrency;
import std.stdio;

void main(){

         int N=10;
         shared int[] arr1=new int[N];
         for(int i; i<N; i++){arr1[i]=i;}
         writeln("Main thread, msg= ", arr1);
         auto j=spawn(&fun);
         j.send(thisTid, arr1);
         assert(receiveOnly!Tid()==j);

}

void fun(){
         auto msg= receiveOnly!(Tid, shared int[])();
         writeln("child thread, msg= ", msg[1]);
         msg[0].send(thisTid);
}

./a.out
Main thread, msg= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
child thread, msg= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Sep 10