『man pages section 3: Threads and Realtime Library Functions』の スレッドについて、インタフェースのスレッドサポートの安全レベルのカテゴリを表 6-1 にリストしています。(これらのカテゴリの詳細は、Intro(3) のマニュアルページを参照してください)
表 6-1 インタフェースの安全レベル
カテゴリ |
説明 |
---|---|
Safe「安全」 |
このコードをマルチスレッドアプリケーションから呼び出しても安全 |
Safe with exceptions「例外付きで安全」 |
例外の内容については、マニュアルページの「注意事項 (NOTES)」の節を参照 |
Unsafe「安全ではない」 |
このインタフェースをマルチスレッドアプリケーションで使用するのは危険。ただし、複数のスレッドが、ライブラリ内で同時に実行されないようにアプリケーション側が対応すれば使用できる |
MT-Safe「MT-安全」 |
このインタフェースは、マルチスレッドアクセスに完全に対応している。つまり、安全であると同時に並行性もサポートしている |
MT-Safe with exceptions「例外付きで MT-安全」 |
例外については、『man pages section 3』の「注意事項 (NOTES)」の節を参照 |
このルーチンをシグナルハンドラから安全に呼び出すことができる。「非同期シグナル安全」ルーチンは、シグナルが割り込んでも自己デッドロックにならない |
|
Fork1-Safe「fork1-安全」 |
このときインタフェースは、Solaris の fork1(2) または POSIX の fork(2) が呼び出されたときに、保持していたロックを解放する |
『man pages section 3』からのインタフェースの安全レベルについては付録 C 「「MT-安全」ライブラリインタフェース」 を参照してください。該当するマニュアルページを参照してレベルを確認してください。
次の理由により安全化されていない関数もあります。
その関数を「MT-安全」にすると、シングルスレッドアプリケーションの性能に悪影響を及ぼす。
その関数が、安全ではないインタフェースを持っている。たとえば、スタックに確保したバッファへのポインタを戻すような関数です。こうした関数には、リエントラント (再入可能) な代替関数が用意されている場合があります。オリジナルの関数名の末尾に「_r」が付いているのがリエントラントな関数です。
関数名の末尾に「_r」が付いていない関数がマルチスレッドに対して安全かどうかは、マニュアルページを参照してください。「MT-安全」ではないことが明記されている関数は、同期機構で保護するか、初期スレッド以外では使用しないでください。
危険なインタフェースをもつ多くの関数には、「MT-安全」な代替関数が用意されています。これらの関数は、オリジナルの関数名の末尾に「_r」を付けることで区別されます。Solaris 環境に用意されている「_r」ルーチンを表 6-2 に示します。
表 6-2 リエントラント関数
asctime_r(3c) |
gethostbyname_r(3n) |
getservbyname_r(3n) |
ctermid_r(3s) |
gethostent_r(3n) |
getservbyport_r(3n) |
ctime_r(3c) |
getlogin_r(3c) |
getservent_r(3n) |
fgetgrent_r(3c) |
getnetbyaddr_r(3n) |
getspent_r(3c) |
fgetpwent_r(3c) |
getnetbyname_r(3n) |
getspnam_r(3c) |
fgetspent_r(3c) |
getnetent_r(3n) |
gmtime_r(3c) |
gamma_r(3m) |
getnetgrent_r(3n) |
lgamma_r(3m) |
getauclassent_r(3) |
getprotobyname_r(3n) |
localtime_r(3c) |
getauclassnam_r(3) |
getprotobynumber_r(3n) |
nis_sperror_r(3n) |
getauevent_r(3) |
getprotoent_r(3n) |
rand_r(3c) |
getauevnam_r(3) |
getpwent_r(3c) |
readdir_r(3c) |
getauevnum_r(3) |
getpwnam_r(3c) |
strtok_r(3c) |
getgrent_r(3c) |
getpwuid_r(3c) |
tmpnam_r(3s) |
getgrgid_r(3c) |
getrpcbyname_r(3n) |
ttyname_r(3c) |
getgrnam_r(3c) |
getrpcbynumber_r(3n) |
|
gethostbyaddr_r(3n) |
getrpcent_r(3n) |