From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 9594B7EE4B for ; Fri, 27 Sep 2013 12:27:32 +0200 (CEST) X-IronPort-AV: E=Sophos;i="4.90,991,1371074400"; d="scan'208";a="34599136" Received: from dhcp-rocq-121.inria.fr (HELO [128.93.62.121]) ([128.93.62.121]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-CAMELLIA256-SHA; 27 Sep 2013 12:27:31 +0200 Message-ID: <52455D91.6000304@inria.fr> Date: Fri, 27 Sep 2013 12:27:29 +0200 From: Romain Bardou User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20130116 Icedove/10.0.12 MIME-Version: 1.0 To: caml-list@inria.fr References: In-Reply-To: X-Enigmail-Version: 1.4.1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Validation-by: romain.bardou@inria.fr Subject: Re: [Caml-list] Thread behaviour Le 27/09/2013 12:10, Tom Ridge a écrit : > Dear caml-list, > > I have a little program which creates a thread, and then sits in a loop: > > -- > > let f () = > let _ = ignore (print_endline "3") in > let _ = ignore (print_endline "hello") in > let _ = ignore (print_endline "4") in > () > > let main () = > let _ = ignore (print_endline "1") in > let t = Thread.create f () in > (* let _ = Thread.join t in *) > let _ = ignore (print_endline "2") in > while true do > flush stdout; > done > > let _ = main () > > -- > > I compile the program with the following Makefile clause: > > test.byte: test.ml FORCE > ocamlc -o $@ -thread unix.cma threads.cma $< > > When I run the program I get the output: > > 1 > 2 > > and the program then sits in the loop. I was expecting the output from > f to show up as well. If you wait a while, it does. But you have to > wait quite a while. > > What am I doing wrong here? I notice that if I put Thread.yield in the > while loop then f's output gets printed pretty quickly. But why should > the while loop affect scheduling of f's thread? > > Thanks > OCaml's thread, unfortunately, are kind of cooperative: you need to yield explicitly. Note that you will obtain an even different (worse) result with a native program. I observed this myself without looking at the thread code itself so maybe there is actually a way to "automatically yield" but as far as I know there is no way to obtain the behavior you want without using either yields or processes instead of threads. This is the reason for the Procord library I am developing (first version to be released before the next OUPS meeting). Also, you don't need to ignore the result of print_endline, as print_endline returns unit. And using let _ = ... in is the same as using ignore, so using both is not needed. Cheers, -- Romain Bardou