线程计算OCaml

时间:2016-01-31 11:21:47

标签: multithreading ocaml

我试图创建一个计算斐波纳契数的线程。这工作正常,但后来我尝试创建另一个线程,如果计算时间超过x秒,则停止计算线程。

这是我的代码:

 module TimedFuture : sig
   type 'a t
   val create : ('a -> 'b) -> 'a -> float -> 'b t
   val get : 'a t -> 'a option
 end = struct

 type 'a t = 'a Event.channel

 let create f a t =
 let c = Event.new_channel () in
 let rec loop f = f (); loop f in
 let task () =
   let b = f a in
   loop (fun () -> Event.(sync (send c b)))
 in
 let start_calc_thread () =
   let t1 = Thread.create task () in
   while ((Unix.gettimeofday () -. t) < 1.0) do
     Printf.printf "Thread should keep running: %f\n"
                  (Unix.gettimeofday () -. t);
   done;
   try Thread.kill t1 with t1 -> ();
   Printf.printf "Thread stoped\n"
 in
 let _ = Thread.create start_calc_thread () in
 c

let get c = Some Event.(sync (receive c))
end


let option_to_i o = match o with
              | None -> 0
              | Some x -> x

let test =
let rec f x = match x with
            | 1 -> 1
            | 2 -> 1
            | _ -> f (x-1) + f (x-2)
in
let t = Unix.gettimeofday () in
let ff = TimedFuture.create f 40 t in
Printf.printf "\nResult: %i\n" (option_to_i (TimedFuture.get ff)),
ff

当我编译代码并运行它时,计算线程并没有停止工作,虽然我得到了&#34;线程停止&#34;在终端。

你看到我的错吗?

1 个答案:

答案 0 :(得分:0)

线程只能在特定的取消点中断,特别是在用户代码将控制权传递回运行时的点上,以便后者可以完成其工作。一个特定的取消点是分配。由于您的代码没有分配,并且合理实施的Fibonacci也不会分配,因此无法阻止它。如果您的真实算法确实没有取消点,那么您应该明确地添加它们或使用进程。要添加显式取消点,可以添加Thread.yield