std.parallelism: How to wait all tasks finished?

Cooler kulkin at hotbox.ru
Thu Feb 6 06:42:56 PST 2014


On Thursday, 6 February 2014 at 11:30:17 UTC, Andrea Fontana 
wrote:
> On Wednesday, 5 February 2014 at 15:38:14 UTC, Cooler wrote:
>> On Tuesday, 4 February 2014 at 03:26:04 UTC, Dan Killebrew 
>> wrote:
>>>>> It seems to me that worker threads will continue as long as 
>>>>> the queue isn't empty. So if a task adds another task to 
>>>>> the pool, some worker will process the newly enqueued task.
>>>>
>>>> No. After taskPool.finish() no way to add new tasks to the 
>>>> queue. taskPool.put will not add new tasks.
>>>
>>> Then perhaps you need to create a new TaskPool (and make sure 
>>> that workers add their tasks to the correct task pool), so 
>>> that you can wait on the first task pool, then wait on the 
>>> second task pool, etc.
>>>
>>> auto phase1 = new TaskPool();
>>> //make sure all new tasks are added to phase1
>>> phase1.finish(true);
>>>
>>> auto phase2 = new TaskPool();
>>> //make sure all new tasks are added to phase2
>>> phase2.finish(true);
>>
>> Will not help. I don't know beforehand what tasks will be
>> created. procData is recursive and it decides create new task 
>> or
>> not.
>
>
> Something like this? (not tested...)
>
> shared bool more = true;
> ...
> ...
> ...
>
> void procData(){
>   if(...)
>   {
>     taskPool.put(task(&procData));
>     more = true;
>   }
> }
>
> while(true)
> {
>    taskPool.finish(true);
>    if (!more) break;
>    else more = false;
> }

It is closer, but after taskPool.finish() all tries to 
taskPool.put() will be rejected. Let's me clear example.

import std.stdio, std.parallelism, core.thread;

shared int i;

void procData(){
   synchronized ++i;
   if(i >= 100)
     return;
   foreach(i; 0 .. 100)
     taskPool.put(task(&procData)); // New tasks will be rejected 
after
                                    // taskPool.finish()
}

void main(){
   taskPool.put(task(&procData));
   Thread.sleep(1.msecs); // The final output of "i" depends on 
duration here
   taskPool.finish(true);
   writefln("i = %s", i);
}

In the example above the total number of tasks executed depends 
on sleep duration.


More information about the Digitalmars-d-learn mailing list