我需要一個例子來說明如何使用ocaml-threads來編寫一個並行的iter函數。我的第一個想法是有一個功能類同此:Howto編程基於線程的並行列表迭代?
let procs = 4 ;;
let rec _part part i lst = match lst with
[] ->()
| hd::tl ->
let idx = i mod procs in
(* Printf.printf "part idx=%i\n" idx; *)
let accu = part.(idx) in
part.(idx) <- (hd::accu);
_part part (i+1) tl ;;
然後並行ITER看起來是這樣的(這裏作爲基於過程的變體):
let iter f lst = let part = Array.create procs [] in
_part part 0 lst;
let rec _do i =
(* Printf.printf "do idx=%i\n" i; *)
match Unix.fork() with
0 -> (* Code of child *)
if i < procs then
begin
(* Printf.printf "child %i\n" i; *)
List.iter f part.(i)
end
| pid -> (* Code of father *)
(* Printf.printf "father %i\n" i; *)
if i >= procs then ignore (Unix.waitpid [] pid)
else _do (i+1)
in
_do 0 ;;
因爲線程模塊的使用是有點不同,我將如何使用ocaml的線程模塊進行編碼?
還有一個問題,_part()函數必須掃描整個列表以將它們分成n個部分,然後每個部分都將通過每個自己的進程(此處)進行管道傳輸。那裏仍然存在一個解決方案,而不是先分開一個列表?
你已經知道,你不會從並行得到任何加速,如果你使用的模塊'Thread'與INRIA的OCaml的?這是一個有趣的編程練習,只是不實際。 – 2010-11-05 13:29:21
是的,我知道一般垃圾收集器中缺少的並行性。但我仍然希望有更好的ocaml實現。但是,如果我使用線程在硬盤上寫東西,我已經看到了在linux'htop中工作的線程。你能解釋哪些限制ocaml詳細(或指向我這樣的信息)?上面的問題是瞭解Threads-module的正確用法。 – 2010-11-05 13:53:45
我給了自己更多的空間,將解釋放在下面的答案中。 – 2010-11-05 17:10:19