読者です 読者をやめる 読者になる 読者になる

再度、とりあえずマルチなechoサーバを試みたら再度玉砕

ocaml

昨日に引き続き…

じゃあ全コネクション分のチャネルを管理すれば良いのでは?とおもい思いっきり手抜き(スレッド間の排他無し)ながらも下記のコードで試してみました。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を使うと無理がでてくるなぁ。