How do I break from loop when using parallel()?

WebFreak001 d.forum at webfreak.org
Mon May 28 21:35:50 UTC 2018


On Monday, 28 May 2018 at 21:04:21 UTC, Dr.No wrote:
> 		import std.parallelism : parallel;
> 		foreach(t; parallel(arr))
> 		{
> 			if(!doSomething(t)) {
> 				return false;
> 			}
> 		}
>
> It reuturns the run time error:
>
>> std.parallelism.ParallelForeachError@(0): Cannot break from a 
>> parallel foreach loop using break, return, labeled 
>> break/continue or goto statements.
>
> What's the proper way to break from loop?

you can't break out because other tasks would still continue to 
finish while the loop is breaking. So either you could use 
`throw` to error out or you could simply create a `bool isDone;` 
and at the start of the loop do `if (isDone) continue;` to make 
all next tasks finish quickly (though CPU usage will be very high 
for a moment, depending on the list size)

If you want total control and break manually (with an uncertainty 
of a few iterations) you can probably create a custom taskPool 
and use the .stop member function on it.

See https://dlang.org/phobos/std_parallelism.html


More information about the Digitalmars-d-learn mailing list