Blog

fork した後に srand を自動的によぶには

srand() をよんだあとでfork(2) を call した場合、子プロセスと親プロセスでおなじシードをもっているために、複数プロセスで生成される乱数がおなじになってしまうということがある。
この問題に対応するためにはどうしたらいいのかとかんがえていたところ、POSIX::AtFork というモジュールがあったのでこれをつかえばいいということになった。これを利用すると pthread_atfork() に callback を設定できるため、以下のようにして srand() を fork(2) したときに自動的によぶことが可能となる。

use POSIX::AtFork qw/:ALL/;
srand();
POSIX::AtFork->add_to_child(sub { srand(); });
if (my $pid = fork()) {
  say rand();
  waitpid($pid, 0);
} else {
  say rand();
}