何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 35955
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

「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
コメント
  • # re: 初めてのスレッドのお仕事
    とっちゃん
    Posted @ 2010/03/29 22:37
    VC++のCRTはマルチスレッド版は最初からそのあたりをスレッドごとに独立管理にしてますねー。
    少なくともおいらが初めてマルチスレッドをやったVC2.0のころには、すでにスレッドごとに独立でした<strtokのキャッシュポインタ

    とはいえデータ破壊型で、使いにくくてDOS時代からオリジナルのものを書いてましたけどw
  • # re: 初めてのスレッドのお仕事
    Jitta
    Posted @ 2010/03/30 21:06
    とっちゃんさん、コメントありがとうございます。

    レポートに書いているのですが、1999年当時、Windows のスレッドについては沢山の情報があるのに、UNIX のについては僅かしか見つけられませんでした。それで「UNIX では新しい技術」と書いたですが。そんなわけで、マイクロソフトが用意したライブラリがスレッド セーフであることは、納得できます。
タイトル
名前
Url
コメント