「T時代のお仕事」というフォルダーがあった。そこから発掘した。
1997年頃だと思っていたけど、1999年11月だったらしい。ということは、2000年の元旦は、誰が張り付いたのだろう?私は京都に張り付いていた。国からもらうデータが2000年対応していなくて、うちのシステムでエラーになり、焦った。
この仕事で参考にしたのは、『実践マルチスレッドプログラミング』という本。もう手元にないので、引っ越しの時にどこかに行ってしまったらしい。
他部門からマルチ スレッドについて問い合わせがあったらしく、こんな返答をしている。
UNIXの、共有メモリ(shmem)を使用する場合と同じと考えてください。“使用する全ての変数を共有メモリ上に置く”と考えると、とらえやすいと思います。
共有メモリでは、1つのシステム内で、複数のプロセスが、共通のリソースを、同時に、アクセスできます。スレッドは、1つのプロセス内で、複数の関数が、共通のリソースを、同時にアクセスします。したがって、複数の関数が、同じリソースを同時に変更する、ことがないように監視しなければなりません。この監視機構がある関数を、「スレッドセーフである関数」と呼びます。
POSIXのスレッドセーフ関数
asctime_r() ctime_r() getgrgid_r() getgrnam_r()
getlogin_r() getpwnam_r() getpwuid_r() gmtime_r()
localtime_r() rand_r() readdir_r() strtok_r()
ttyname_r()
これらの関数は、サフィックス“_r”を取った関数の代換えとして使用されます。元の関数は静的領域に作業用変数を持つため、同じプロセス空間で実行される他のスレッドによって作業用変数の内容が書き換えられる可能性があります。これらの関数は、その作業用の変数領域を呼び出し元が与えてやることで、スレッド間で作業領域が重ならないようにしています。
この間、VC++9.0 の CRT から strtok のコードを眺めて、「スレッド セーフだったんだ」と思ったのだが、この記録を見ると、2000年当時の UNIX の strtok は、スレッド アンセーフだったようだ。
追加
探していた、その仕事のレポートが見つかったので、公開する。会社名などはA社、B社に修正した。
中に書いている、「UNIX では、マルチスレッドは新しいプログラミング技術」というのは、嘘。情報を探せなかっただけ。
投稿日時 : 2010年3月29日 21:50