マルチスレッドのプログラミング

マルチスレッドインタフェースの安全レベル

関数やインタフェースのマニュアルページは、その関数またはインタフェースでのスレッドのサポート範囲を示しています。各マニュアルページの「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) が呼び出されたときに、保持していたロックを解放する

次の理由により安全化されていない関数もあります。


注 –

名前の末尾に「_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)