Manpages

名 前

pthread_atfork − fork(2) の 際 に 呼 び 出 さ れ る ハ ン ド ラ を 登 録 す る

書 式

int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));

説 明

pthread_atforkfork(2) に よ っ て 新 し い プ ロ セ ス が 生 成 さ れ る 際 、 そ の 直 前 と 直 後 に 呼 び 出 さ れ る ハ ン ド ラ 関 数 を 登 録 す る 。 prepare ハ ン ド ラ は 、 新 し い プ ロ セ ス が 生 成 さ れ る 直 前 に 親 プ ロ セ ス か ら 呼 び 出 さ れ る 。 parent ハ ン ド ラ は 、 fork(2) が リ タ ー ン す る 直 前 に 親 プ ロ セ ス か ら 呼 び 出 さ れ る 。 child ハ ン ド ラ は fork(2) が 返 る 直 前 に 子 プ ロ セ ス か ら 呼 び 出 さ れ る 。

prepare, parent お よ び child の 三 つ の ハ ン ド ラ の う ち の 一 つ ま た は 複 数 に NULL を 与 え る こ と が で き る が 、 こ れ は 対 応 す る 時 点 で い か な る ハ ン ド ラ を も 呼 び 出 す 必 要 が な い こ と を 意 味 す る 。

pthread_atfork は 複 数 の ハ ン ド ラ の 組 合 せ を 登 録 す る た め に 複 数 回 呼 び 出 す こ と が 可 能 で あ る 。 fork(2) の 時 点 で 複 数 の prepare ハ ン ド ラ は LIFO 順 で 呼 び 出 さ れ る ( pthread_atfork で 最 後 に 加 え ら れ た も の が fork の 前 に 最 初 に 呼 び 出 さ れ る )。 他 方 、 parentchild は FIFO 順 で 呼 び 出 さ れ る (最 初 に 加 え ら れ た も の が 最 初 に 呼 び 出 さ れ る )。

pthread_atfork の 目 的 を 理 解 す る た め に 、 fork(2) は 、 現 在 ロ ッ ク 状 態 に あ る mutex も 含 め て 、 呼 び 出 し た ス レ ッ ド の み の メ モ リ 空 間 全 体 を 複 製 す る こ と を 思 い 出 そ う 。 つ ま り 、 他 の ス レ ッ ド は 子 プ ロ セ ス で は 実 行 さ れ て い な い の で あ る 。 従 っ て 、 fork を 呼 び 出 し た ス レ ッ ド 以 外 の ス レ ッ ド に よ っ て mutex が ロ ッ ク さ れ て い る の な ら ば 、 そ の mutex は 子 プ ロ セ ス の 中 で 永 遠 に ロ ッ ク さ れ た ま ま で あ り 、 子 プ ロ セ ス の 実 行 を ブ ロ ッ ク す る 可 能 性 が あ る 。 こ れ を 避 け る た め に は 、 pthread_atfork で 次 の よ う な ハ ン ド ラ を 登 録 す れ ば 良 い だ ろ う : prepare ハ ン ド ラ が 大 域 的 な mutex を (ロ ッ ク す る 際 の 順 序 で )ロ ッ ク し 、 parentchild が そ れ ら を (逆 の 順 に )ア ン ロ ッ ク す る 。 ま た は 、 prepareparentNULL に 設 定 し 、 child を 大 域 的 な mutex に 対 し て pthread_mutex_init を 呼 び 出 す 関 数 に 設 定 し て も 良 い だ ろ う 。

返 り 値

pthread_atfork は 成 功 す れ ば 0 を 返 し 、 エ ラ ー が あ れ ば 非 ゼ ロ の エ ラ ー コ ー ド を 返 す 。

エ ラ ー

ENOMEM ハ ン ド ラ を 登 録 す る の に メ モ リ が 足 り な い 。

著 者

Xavier Leroy <Xavier.Leroy [AT] inria.fr>

関 連 項 目

fork(2), pthread_mutex_lock(3), pthread_mutex_unlock(3).

[訳 注 ] glibc-linuxthreads の 最 新 の ド キ ュ メ ン ト は Texinfo形 式 で 提 供 さ れ て い る 。 以 下 は glibc-linuxthreads-2.3.1 の Texinfo フ ァ イ ル か ら の 引 用 で あ る 。

pthread_atfork の 目 的 を 理 解 す る た め に 、 fork が 現 在 ロ ッ ク 状 態 に あ る mutex も 含 め た メ モ リ 空 間 全 体 を 、 し か し 呼 び 出 し ス レ ッ ド だ け を 複 製 す る こ と を 思 い 出 し て ほ し い 。 つ ま り 、 他 の ス レ ッ ド は 子 プ ロ セ ス で は 実 行 さ れ な い 。 mutex は fork の 後 は 使 う こ と が で き ず 、 子 プ ロ セ ス で pthread_mutex_init を 使 っ て 初 期 化 さ れ な け れ ば な ら な い 。 こ れ は 現 在 の 実 装 の 制 限 で 、 将 来 の バ ー ジ ョ ン で も 存 在 す る か も し れ な い し 、 存 在 し な い か も し れ な い 。 こ れ を 避 け る た め に は 、 pthread_atfork で 次 の よ う な ハ ン ド ラ を 登 録 す れ ば よ い : prepare ハ ン ド ラ で mutex を (ロ ッ ク す る 際 の 順 序 で ) ロ ッ ク し 、 parent ハ ン ド ラ で mutex を ロ ッ ク 解 除 す る 。 child ハ ン ド ラ で は pthread_mutex_init を 使 用 し て mutex を 初 期 化 し な け れ ば な ら な い 。 条 件 変 数 な ど の 他 の 同 期 オ ブ ジ ェ ク ト に つ い て も 同 様 で あ る 。 グ ロ ー バ ル mutex を fork の 前 に ロ ッ ク す る と 、 他 の ス レ ッ ド は す べ て 、 そ れ ら の グ ロ ー バ ル mutex で 保 護 さ れ る コ ー ド の ク リ テ ィ カ ル 領 域 か ら 締 め 出 さ れ る 。 し た が っ て fork が 親 プ ロ セ ス の ア ド レ ス 空 間 の ス ナ ッ プ シ ョ ッ ト を 取 る と 、 そ の ス ナ ッ プ シ ョ ッ ト は 有 効 で 安 定 し た デ ー タ を コ ピ ー す る 。 子 プ ロ セ ス で 同 期 オ ブ ジ ェ ク ト を 初 期 化 す る こ と で 親 プ ロ セ ス の ス レ ッ ド サ ブ シ ス テ ム に 由 来 す る も の が 適 切 に 清 め ら れ る こ と が 保 証 さ れ る 。 例 え ば 、 mutex は 獲 得 を 待 つ ス レ ッ ド の 待 ち キ ュ ー を 引 き 継 ぐ が 、 こ の 待 ち キ ュ ー は 子 プ ロ セ ス で は 意 味 を 持 た な い 。 mutex を 初 期 化 す る こ と で こ の こ と に 対 処 す る 。