再度、とりあえずマルチなechoサーバを試みたら再度玉砕
昨日に引き続き…
じゃあ全コネクション分のチャネルを管理すれば良いのでは?とおもい思いっきり手抜き(スレッド間の排他無し)ながらも下記のコードで試してみました。chsリストにチャネルを放り込んでます。
open Unix open Event let rec loop f = f (); loop f let gone f = ignore (Thread.create loop f) let chs = ref [] let send_all x = List.iter (fun ch -> sync (send ch x)) !chs let process ich och = let my_ch = new_channel () in chs := my_ch :: !chs; (* world_ch -> connection *) gone ( fun () -> output_string och (sync (receive my_ch)); flush och ); (* connection -> world_ch *) loop ( fun () -> send_all (input_line ich) ) let _ = let sa = ADDR_INET (inet_addr_any, 54321) in ignore (establish_server process sa)
結果は昨日と変わらず、各々のコネクションに閉じた送受信になっていました。トップレベル変数はスレッド間で共有されないみたいですねぇ。昨日の挙動もそちらが原因な気がしてきました。
う〜〜〜む、establish_serverを使うと無理がでてくるなぁ。