06.05.2020 07:25, data pulverizer пишет:
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;
};
proc is already a delegate, so &proc is a pointer to the delegate, just
pass a `proc` itself
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)
```