2008-08-27 (水)
*[プログラミング] スレッド
最近は,マルチスレッドのプログラムを書くとき,.NETのThreadもどきのクラスを作って使っているのだけど,こいつはLinuxとかで使えません.
昔書いたWindowsのスレッドをpthreadみたいにするヘッダファイルを見ながら書き直そうと思ったけど,pthreadだとsuspendとresumeが出来ない気がする.
ソースレベルでクロスプラットフォームを目指すより,Wineとかに頼った方が実は移植性が高いんじゃなかろうか….
ここから別の話.
ふと気になってしまったのだけど,スレッド間で共有しているデータ以外(つまりスレッド固有のデータ)にアクセスする場合には,ロックしなくても正常に動作することって本当に保障されているんでしょうか?
極端な例だと,
char data[2];
というデータに対してスレッドAはdata[1]を使い,スレッドBはdata[2]を使うというのは真っ当な神経をしているプログラマなら,なにか危険を感じるはずです.もっと極端な例では,1バイトのうち,3ビットをスレッドAが,5ビットをBが使うなんてこともあるかもしれません.
何が心配かというと,メモリアクセスの単位はCPU依存だということです.CPUによっては1バイト書き換えるときに,ワード単位で読みこんで,1バイト書き換えたあと,またワード単位で書き戻す場合があります.今のところ1ワードなんて高々数バイトでしょうが,上限が保障されているわけではありません.
メモリ上でどのくらい離れた位置にあれば,スレッド間で干渉しないかが私には分からないのですが….