<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
<style type="text/css" style="display:none"><!-- p { margin-top: 0px; margin-bottom: 0px; }--></style>
</head>
<body dir="ltr" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
<p>Recently added ThreadPoolExecutor limits number of worker threads to number of logical processors.<br>
</p>
<p>This might cause deadlock in case one's doing nested calls to parallel_for_each, like this:<br>
</p>
<p><br>
</p>
<p>void Bar() { ... <span style="font-size: 12pt;">}</span></p>
<p><br>
</p>
<p>void Foo() {<br>
</p>
<p>    parallel_for_each(Begin, End, Bar);<br>
</p>
<p>}</p>
<p><br>
</p>
<p>void main() {<br>
</p>
<p>  parallel_for_each(Begin, End, Foo);<br>
</p>
<p>}<br>
</p>
<p><br>
</p>
<p>This happens because both parallel_for_each and parallel_for_each_n wait for task group to finish<br>
</p>
<p>and this may actually never happen in case they're executed from worker threads. In such case worker</p>
<p>thread is blocked in TaskGroup destructor. This does happen <span style="font-size: 12pt;">in lld, when it writes output sections as </span></p>
<p><span style="font-size: 12pt;">th</span><span style="font-size: 12pt;">ere is a nested call to parallel_for_each_n to write each </span><span style="font-size: 12pt;">output section inputs.</span><span style="font-size: 12pt;"> </span></p>
</body>
</html>