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