Thread-Berechnung in oCaml

Domi95

Newbie
Registriert
Aug. 2009
Beiträge
3
Hey,

ich hab mich an der Thread-Programmierung in oCaml versucht und einen Thread erstellt der die Fibonacci-Zahlen berechnet. Das hat auch alles soweit funktioniert.

Jetzt wollte ich einen zweiten Thread erstellen, welcher den ersten (der die Berechnung durchführt) killt, sobald dieser mehr als x Sekunden dafür benötigt.

Das ist mein Code:

Code:
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

Wenn ich den Code compiliere und ausführe, wird der Berechnungsthread allerdings nicht gestoppt, obwohl die while-Schleife nach einer Sekunde verlassen wird und im Terminal die Ausgabe: "Thread stopped" erscheint, bekomm ich danach das Ergebnis genauso zurück.
Da ich Anfänger in oCaml und Thread-Programmierung bin seh ich nicht so wirklich wo mein Fehler liegt.
Vielleicht aber ihr?

Vielen Dank schonmal!
 
Wenn ich das richtig sehe, berechnest du die 40. Fibonacci Zahl. Das dauert vermutlich deutlich weniger als 1 Sekunde, daher dürfte es dann zu spät sein den Thread zu killen.
Desweiteren sieht deine get-Funktion falsch aus. Event.sync blockiert ja dann im Zweifelsfall für immer. Denke mal, du musst Event.poll benutzen.
 
Zurück
Oben