In article <200011252247.HAA09258 / sharui.nakada.kanuma.tochigi.jp>,
  nobu.nakada / nifty.ne.jp writes:

> > forkとthreadを混ぜるのはかなり問題の元です。
> > いっそ、fork_and_kill_other_threadsをforkの標準仕様にしちゃ
> > いましょうか。
> 
>  というか、fork する以前の thread が新しいプロセス空間でまで動
> いてくれて嬉しい状況というのが、ちょっと想像つかなかったんです
> が。fork した時点でその thread が main になってそれ以外は存在し
> ない、というのでどうでしょうか。

それが fork_and_kill_other_threads の意図です。
(書くのを忘れていたので追記しておきますが、殺すのは子プロセス側での話
で、親プロセス側では当然、動いたままです。)

すこし考えたのですが、プロセス外との通信を行なっている thread が fork
で複製されると問題になりがちである、というのは確かだと思います。

# 例外もあるような気もしますが。accept しては Thread.new するだけの
# loop とか。

で、疑問なのはプロセス外との通信を(直接には)行なわない thread について
です。thread プログラミングは素人(じつは今回初めて thread を使った)な
のでよくわからないのですが、そういうものは fork 時にどのような振舞を示
すのが適切なことが多いんでしょうか? それともそんな thread は普通使われ
ない?

ちなみに、The Single UNIX (R) Specification, Version 2 を調べてみると、
fork(2) はまさに fork_and_kill_other_threads のような動作をするようで
す。

    A process is created with a single thread. If a multi-threaded process
    calls fork(), the new process contains a replica of the calling thread and
    its entire address space, possibly including the states of mutexes and
    other resources. Consequently, to avoid errors, the child process may only
    execute async-signal safe operations until such time as one of the exec
    functions is called. Fork handlers may be established by means of the
    pthread_atfork() function in order to maintain application invariants
    across fork() calls.

そして、特別なことをしたい場合には pthread_atfork で fork 時に実行され
る 3種類(fork 前、fork 後の親、fork 後の子)の処理を設定できるようです。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「くっだらないコト聞いちゃったねー$(C⊇ ごっめーん$(C⊇」
  (魔法使い養成専門 マジックスター学院 2, 南澤ミヅキ)