Error running concurrent process and storing results in array

data pulverizer data.pulverizer at gmail.com
Wed May 6 04:25:03 UTC 2020


On Wednesday, 6 May 2020 at 03:56:04 UTC, Ali Çehreli wrote:
> On 5/5/20 8:41 PM, data pulverizer wrote:> On Wednesday, 6 May 
> 2020 at 03:33:12 UTC, Mathias LANG wrote:
> >> On Wednesday, 6 May 2020 at 03:25:41 UTC, data pulverizer
> wrote:
>
> > Is there something I need to do to wait for each thread to
> finish
> > computation?
>
> thread_joinAll(). I have an example here:
>
>   
> http://ddili.org/ders/d.en/concurrency.html#ix_concurrency.thread_joinAll

This worked nicely thank you very much

> ... I want to point out that there is also std.parallelism, 
> which may be better suited in many cases.

I actually started off using std.parallelism and it worked well 
but the CPU usage on all the threads was less than half on my 
system monitor meaning there is more performance to be wrung out 
of my computer, which is why I am now looking into spawn. When 
you suggested using thread_joinAll() I saw that is in 
`core.thread.osthread` module. It might be shaving the yak this 
point but I have tried using `Thread` instead of `spawn`:

```
void process(double x, double y, long i, shared(double[]) z)
{
   z[i] = x*y;
}

void main()
{
   import core.thread.osthread;
   import std.stdio: writeln;

   long n = 100;
   shared(double[]) z = new double[n];
   for(long i = 0; i < n; ++i)
   {
     auto proc = (){
       process(cast(double)(i), cast(double)(i + 1), i, z);
       return;
     };
     new Thread(&proc).start();
   }
   thread_joinAll();
   writeln("z: ", z);
}
```
and I am getting the following error:

```
onlineapp.d(20): Error: none of the overloads of this are 
callable using argument types (void delegate() @system*), 
candidates are:
/dlang/dmd/linux/bin64/../../src/druntime/import/core/thread/osthread.d(646):        core.thread.osthread.Thread.this(void function() fn, ulong sz = 0LU)
/dlang/dmd/linux/bin64/../../src/druntime/import/core/thread/osthread.d(671):        core.thread.osthread.Thread.this(void delegate() dg, ulong sz = 0LU)
/dlang/dmd/linux/bin64/../../src/druntime/import/core/thread/osthread.d(1540):        core.thread.osthread.Thread.this(ulong sz = 0LU)
```





More information about the Digitalmars-d-learn mailing list