Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby并行排序_Ruby_Multithreading_Sorting_Concurrency_Parallel Processing - Fatal编程技术网

Ruby并行排序

Ruby并行排序,ruby,multithreading,sorting,concurrency,parallel-processing,Ruby,Multithreading,Sorting,Concurrency,Parallel Processing,我正在尝试创建排序算法的多线程版本。我不明白为什么这个算法总是只返回数组[1]而不是完整的数组 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, gr

我正在尝试创建排序算法的多线程版本。我不明白为什么这个算法总是只返回
数组[1]
而不是完整的数组

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
类数组
def快速排序

如果self.length本地变量
l
g
未传递到
Process.fork
之外,则返回self。它们仅在该区块内有效。比如说,

Process.fork{a = 2}
Process.wait
a #=> NameError: undefined local variable or method `a' for main:Object
在您的代码中,在
过程之前完成的
l
g
赋值。fork
在调用
return l+[pivot]+g
时仍然有效


顺便说一句,如果您打算从
Process.fork
传递
l
g
,那么在
Process.fork
之前初始化这些变量是没有意义的。

从您的示例中可以看出,您试图使用的流程实际上是想要使用的

进程:与调用方(父级)没有共享资源

线程:与其父线程共享内存

如果将
进程.fork
替换为
线程
,则您的示例将有效:

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

你说的
Array[1]
是什么意思?一个只有一个元素的数组,比如
a=Array.new([1])
为什么不写
[1]
?我是说这是它返回的,不是我想要的,加上我是ruby新手,所以我不知道所有的代码等价性。顺便说一句,你有一个语法错误,其中一个块没有包含正确的参数:
less,greater\u=self[1..-1]。分区{yield(x,pivot)}
应该是
less,greater\u=self[1..-1]。分区{x | yield(x,pivot)}
,但是从我读到的内容来看,如果我执行
l=Process fork.fork{less.quick\u sort}
,L现在是fork的pid,而不是进程的返回。