PTHREAD_ATFORK

Section: C Library Functions (3)
Updated: LinuxThreads
IndexJM Home Page

 

名前

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@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 を初期化することでこのことに対処する。


関連キーワード

mutex,ハンドラ,pthread,プロセス,ロック,atfork,child,parent,prepare,ATFORK 

Index

名前
書式
説明
返り値
エラー
著者
関連項目

This document was created byman2html, using the manual pages.
Time: 03:39:09 GMT, June 22, 2021