<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>