[IronPython] concurrent list access

Severin seob at gmx.ch
Mon Oct 6 06:09:23 CEST 2008


Hello,
I have a problem with lists.

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 approach and at a certain
level the list ist just sorted using the sort function.

for some reason it doesn't work on ironpython (2.0B5 on Vista, quad-core)
sometimes.

so:
- can my concurrent list access corrupt the list? (especially the slice
operator)
- can anybody see another problem here?

any hint is appreciated

Severin

here is the code:
-----
import threading

threads = []

def partition(array, begin, end):
        while begin < end:
             while begin < end:
                if array[begin] > array[end]:
                    (array[begin], array[end]) = (array[end], array[begin])
                    break
                end -= 1
             while begin < end:
                if array[begin] > array[end]:
                    (array[begin], array[end]) = (array[end], array[begin])
                    break
                begin += 1
        return begin


def quicksort(array, begin, end):
        if begin < end:

            if end - begin <= 2**12:
                #print "%d %d" % (begin, end)
                sorted = [x for x in array[begin:end]]
                sorted.sort()
                array[begin:end] = sorted
            else:

                split = partition(array, begin, end-1)

                thread = threading.Thread(target=quicksort, args=(array,
begin, split,))
                thread.start()
                threads.append(thread)

                thread = threading.Thread(target=quicksort, args=(array,
split+1, end))
                thread.start()
                threads.append(thread)



if __name__ == '__main__':

    import random

    # settings
    n = 2**14

    # setup
    l = range(n)
    random.shuffle(l)

    # sort
    quicksort(l, 0, len(l))

    # join
    for thread in threads:
        thread.join()

    # test
    for i in range(n):
        if i != l[i]:
            print 'failure %d != %d' % (i, l[i])

    print 'done'
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20081006/ddb3fb9d/attachment.html>


More information about the Ironpython-users mailing list