(************************************************************ rightThreadTest.ml Created : Fri Aug 30 16:35:00 2002 Last modified: Fri Aug 30 23:36:56 2002 Compile: ocamlopt.opt -thread unix.cmxa threads.cmxa str.cmxa rightThreadTest.ml -o rightThreadTest # ************************************************************) (** 予想どおり。2番目のスレッドのマッチの結果が1番目のものに影響して 間違った結果を出す。グローバルにあるものは本当にグローバル。どこまで グローバル?? ロックを使って正してみよう @author 増山隆 @see http://www002.upp.so-net.ne.jp/mamewo/ml.html *) let target1 = "hogehogeGEGE tak" let target2 = "mamewo mmmmmm" let lock = Mutex.create () let regexp1 = Str.regexp "hogehoge\\(.+\\)$" let regexp2 = Str.regexp "\\(.+\\) mm" let entry (str,reg,sec) = begin (* ここらへん *) Mutex.lock lock; let is_matched = Str.string_match reg str 0 in Thread.delay sec; if is_matched then print_string ((Str.matched_group 1 str)^"\n") else print_string "not matched\n"; (* ここ *) Mutex.unlock lock; flush stdout; end let _ = let t1 = Thread.create entry (target1,regexp1,10.0) and t2 = Thread.create entry (target2,regexp2,0.0) in begin (* t1 は "GEGE tak" を出力するはずだが... *) Thread.join t1; Thread.join t2; print_string "finished\n"; end