1

Я пытаюсь создать многопоточную версию алгоритма сортировки. Я не понимаю, почему этот алгоритм всегда возвращает только Array[1] вместо полного массива.Ruby parallel sorting

class Array 
    def quick_sort 
    return self if self.length <= 1 
    pivot = self[0] 
    if block_given? 
     less, greater_equals = self[1..-1].partition { yield(x, pivot) } 
    else 
     less, greater_equals = self[1..-1].partition { |x| x < pivot } 
    end 
    l = [] 
    g = [] 
    Process.fork {l = less.quick_sort } 
    Process.fork {g = greater_equals.quick_sort} 
    Process.waitall 
    return l + [pivot] + g 
    end 
end 
+0

Что вы подразумеваете под 'Array [1]'? – sawa

+0

Массив с одним элементом типа 'a = Array.new ([1])' – DeMarco

+0

Почему бы вам не написать '[1]'? – sawa

ответ

2

Локальные переменные l и g не передаются за пределы Process.fork. Они действительны только в этом блоке. Например,

Process.fork{a = 2} 
Process.wait 
a #=> NameError: undefined local variable or method `a' for main:Object 

В своем коде, то l и g задания, сделанные до того Process.fork все еще действительны, если вы звоните return l + [pivot] + g.

Кстати, если вы намеревались l и g быть переданы от Process.fork, то ваша инициализация этих переменных до Process.fork не имеет смысла.

+0

Но из того, что я прочитал, если я делаю' l = Process.fork {less.quick_sort} ', L теперь является pid fork, а не возвратом процесса. – DeMarco

1

Из ваших примеров, похоже, вы пытаетесь использовать процесс, в котором вы действительно хотите использовать thread.

процесса: нет общих ресурсов с вызывающей (Parent)

Тема: акции памяти с материнской

Ваш пример будет работать, если вы заменили Process.fork с Threads:

l = [] 
g = [] 
left_thread = Thread.new {l = less.quick_sort } 
right_thread = Thread.new {g = greater_equals.quick_sort} 
left_thread.join 
right_thread.join 
return l. + [pivot] + g