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