<div dir="ltr">Looking at the code, I believe that it&#39;s possible for slice-assignment to cause a problem with multiple threads.&nbsp; (In fact, there&#39;s a comment there that says &quot;// race is tolerable...&quot;.)&nbsp; I suspect that the operation could be made more thread-safe by incorporating the following logic:<br>
1) If the source of the assignment is user-defined type, incur the extra expense of copying that collection into a local list.<br>2) Hold a lock for the entire time that the target list is mutated.<br><br>This would involve a performance hit when the source is a user-defined type -- oh, well.<br>
<br>You can try to confirm this hypothesis by replacing the slice-assignment with a loop that replaces the values one at a time.&nbsp; If making this change prevents the problem, then the slice-assignment is indeed at fault and you should file a problem report on CodePlex at <a href="http://www.codeplex.com/IronPython/WorkItem/List.aspx">http://www.codeplex.com/IronPython/WorkItem/List.aspx</a><br>
<br><div class="gmail_quote">On Sun, Oct 5, 2008 at 9:09 PM, Severin <span dir="ltr">&lt;seob@gmx.ch&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr"><div class="gmail_quote"><div dir="ltr"><span style="border-collapse: collapse;">Hello,<div><br></div><div>I have a problem with lists.</div><div><br></div><div>Taking a quick look to the IronPython list implementation they intend to be thread safe (I guess). now I made a quicksort example that sorts a list in place using threads. its a divide and conquer&nbsp;approach and at a certain level the list ist just sorted using the sort function.</div>


<div><br></div><div>for some reason it doesn&#39;t work on ironpython (2.0B5 on Vista, quad-core) sometimes.</div><div><br></div><div>so:</div><div>- can my concurrent list access corrupt the list? (especially the slice operator)</div>


<div>- can anybody see another problem here?</div><div><br></div><div>any hint is appreciated</div><div><br></div><div>Severin</div><div><br></div><div>here is the code:</div><div>-----</div><div><div>import threading</div>


<div><br></div><div>threads = []</div><div><br></div><div>def partition(array, begin, end):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while begin &lt; end:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while begin &lt; end:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if array[begin] &gt; array[end]:</div>


<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(array[begin], array[end]) = (array[end], array[begin])</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end -= 1</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while begin &lt; end:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if array[begin] &gt; array[end]:</div>


<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(array[begin], array[end]) = (array[end], array[begin])</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin += 1</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return begin</div><div><br></div><div><br></div>

<div>
def quicksort(array, begin, end):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if begin &lt; end:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if end - begin &lt;= 2**12:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#print &quot;%d %d&quot; % (begin, end)</div><div>

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sorted = [x for x in array[begin:end]]</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sorted.sort()</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;array[begin:end] = sorted</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;split = partition(array, begin, end-1)</div><div><br></div>


<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread = threading.Thread(target=quicksort, args=(array, begin, split,))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread.start()</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;threads.append(thread)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread = threading.Thread(target=quicksort, args=(array, split+1, end))</div>


<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread.start()</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;threads.append(thread)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div><br></div><div><br></div><div>if __name__ == &#39;__main__&#39;:</div><div>&nbsp;&nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;import random</div>


<div>&nbsp;&nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;# settings</div><div>&nbsp;&nbsp; &nbsp;n = 2**14</div><div>&nbsp;&nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;# setup</div><div>&nbsp;&nbsp; &nbsp;l = range(n)</div><div>&nbsp;&nbsp; &nbsp;random.shuffle(l)</div><div>&nbsp;&nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;# sort</div><div>&nbsp;&nbsp; &nbsp;quicksort(l, 0, len(l))</div>


<div><br></div><div>&nbsp;&nbsp; &nbsp;# join</div><div>&nbsp;&nbsp; &nbsp;for thread in threads:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;thread.join()</div><div>&nbsp;&nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;# test</div><div>&nbsp;&nbsp; &nbsp;for i in range(n):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if i != l[i]:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print &#39;failure %d != %d&#39; % (i, l[i])</div>


<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp;print &#39;done&#39;</div></div></span></div>
</div><br></div>
<br>_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.ironpython.com">Users@lists.ironpython.com</a><br>
<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br></blockquote></div><br></div>