From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id PAA15290; Tue, 1 Jul 2003 15:34:21 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id PAA15494 for ; Tue, 1 Jul 2003 15:34:20 +0200 (MET DST) Received: from aomori.annexia.org (annexia.force9.co.uk [212.56.101.183]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id h61DYJj27567 for ; Tue, 1 Jul 2003 15:34:19 +0200 (MET DST) Received: from rich by aomori.annexia.org with local (Exim 3.36 #1 (Debian)) id 19XLGx-0007LU-00 for ; Tue, 01 Jul 2003 14:34:15 +0100 Date: Tue, 1 Jul 2003 14:34:15 +0100 To: caml-list@inria.fr Subject: [Caml-list] Threads & the order that module initialization code runs Message-ID: <20030701133415.GA28214@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.4i From: Richard Jones X-Spam: no; 0.00; threads:01 simulating:01 freshmeat:01 team's:01 ltd:98 modules:02 thread:02 business:96 module:03 bunch:03 data:03 let:04 prototype:04 array:04 ------:94 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk A quick question about threads: I have a few modules simulating a network and some machines connected to the network. In, for example, network.ml, I have a bunch of initialization code at the top level: --- network.ml --- let new_queue i = (Queue.create (), Mutex.create (), Condition.create ()) in let out_queue = Array.init nr_machines new_queue (* There is one queue of incoming messages to the network thread. *) let in_queue = Queue.create () (* Mutex/condition protecting the in_queue. *) let in_mutex = Mutex.create () let in_cond = Condition.create () ------ And also I have a Main module which starts up the threads: --- main.ml --- (* Create a thread to simulate the network. *) let network_thread = Thread.create Network.run ();; (* Start a thread for each of the simulated machines. *) let machine_thread = Array.init nr_machines (Thread.create Machine.run);; ------ It's obviously going to be a problem if the initialization code in Network hasn't run by the time the machine threads have been started up in Main (or if the network thread itself gets started up first). Now it all seems to work, but am I being lucky or do module initializers run in some sort of well-defined order I can depend on? Rich. -- Richard Jones. http://www.annexia.org/ http://freshmeat.net/users/rwmj Merjis Ltd. http://www.merjis.com/ - all your business data are belong to you. 'There is a joke about American engineers and French engineers. The American team brings a prototype to the French team. The French team's response is: "Well, it works fine in practice; but how will it hold up in theory?"' ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners