Is this a good idea?

Dr.No jckj33 at gmail.com
Sat Sep 1 16:20:11 UTC 2018


On Thursday, 30 August 2018 at 21:09:35 UTC, Peter Alexander 
wrote:
> On Thursday, 30 August 2018 at 19:59:17 UTC, Dr.No wrote:
>> I would to process the current block in parallel but priting 
>> need to be theread-safe so I'm using
>>
>>> foreach(x; parallel(arr)) {
>>>    auto a = f(x);
>>>    auto res = g(a);
>>>    synchronized {
>>>	stdout.writeln(res);
>>>	stdout.flush();
>>>     }
>>> }
>>
>>
>> Since f() and g() are some heavy functions, I'd like to 
>> process in parallel but the printing (doesn't need to respect 
>> order but must be thread-safe) hence I'm using synchronized. 
>> Is this counter-productive in any way?
>
> I don't see any problem with that assuming f and g are 
> significantly more expensive than writeln. The flush can be 
> moved outside the synchronized block.

why move flush to outside the synchronized block?
trying out this approach I found to be ok except in some cases, 
the output look like that:

>outjson = {"barCode":"XXXX1","ade":"1"}
>outjson = {"barCode":"XXXX2","ade":"2"}
>outjson = {"barCode":"XXXX3","ade":"3"}
>outjson = {"barCode":"XXXX4","ade":"4"}
>outjson = {"barCode":"XXXX5","ade":"5"}
// and so on...

then there is this output:

> outjson = {"barCode":"XXXX20","ade":"20"}♪◙outjson = 
> {"barCode":"XXXXX21","ade":"21"}

within the synchronized block.
This is supposed to be:

> outjson = {"barCode":"XXXX20","ade":"20"}
> outjson = {"barCode":"XXXXX21","ade":"21"}

also there's that extra ♪◙ character. Thos sounds memory 
violation somewhere.
This only happens when using parallel. Any guess what's possibily 
happeing?



More information about the Digitalmars-d-learn mailing list