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

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

SunOS Reference Manual』の Section 3「Library Routines」では、スレッドをサポートするインタフェースを、次のカテゴリに分類しています (これらのカテゴリの詳細は、Intro(3) のマニュアルページを参照してください)。

Safe「安全」 

このコードをマルチスレッドアプリケーションから呼び出しても安全 

Safe with exceptions「例外付きで安全」 

例外の内容については、マニュアルページの「注意事項」の節を参照 

Unsafe「安全ではない」 

このインタフェースをマルチスレッドアプリケーションで使用するのは危険。ただし、複数のスレッドが、ライブラリ内で同時に実行されないようにアプリケーション側が対応すれば使用できる 

MT-Safe「MT-安全」 

このインタフェースは、マルチスレッドアクセスに完全に対応している。つまり、安全であると同時に並行性もサポートしている 

MT-Safe with exceptions「例外付きで MT-安全」 

例外については、『SunOS Reference Manual』の Section 3「Library Routines」の「注意事項」の節を参照

Async-Signal-Safe「非同期シグナル安全」

このルーチンをシグナルハンドラから安全に呼び出すことができる。「非同期シグナル安全」ルーチンは、シグナルが割り込んでも自己デッドロックにならない 

Fork1-Safe「fork1-安全」 

このときインタフェースは、Solaris の fork1(2) または POSIX の fork(2) が呼び出されたときに、保持していたロックを解放する

付録 C 「「MT-安全」ライブラリインタフェース」 に、『SunOS Reference Manual』の Section 3「Library Routines」に記載されている「安全なインタフェース」の一覧を示します。詳細は、マニュアルページを参照してください。

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


注意 - 注意 -

関数名の末尾に「_r」が付いていない関数がマルチスレッドに対して安全かどうかは、マニュアルページを参照してください。「MT-安全」ではないことが明記されている関数は、同期機構で保護するか、初期スレッド以外では使用しないでください。


「安全ではない」インタフェースのためのリエントラント関数

危険なインタフェースをもつ多くの関数には、「MT-安全」な代替関数が用意されています。これらの関数は、オリジナルの関数名の末尾に「_r」を付けることで区別されます。Solaris システムに用意されている「_r」ルーチンを表 6-1 に示します。

表 6-1 リエントラントな関数

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)