我试图创建一个计算斐波纳契数的线程。这工作正常,但后来我尝试创建另一个线程,如果计算时间超过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;在终端。
你看到我的错吗?
答案 0 :(得分:0)
线程只能在特定的取消点中断,特别是在用户代码将控制权传递回运行时的点上,以便后者可以完成其工作。一个特定的取消点是分配。由于您的代码没有分配,并且合理实施的Fibonacci也不会分配,因此无法阻止它。如果您的真实算法确实没有取消点,那么您应该明确地添加它们或使用进程。要添加显式取消点,可以添加Thread.yield
。