[PHP-users 32363] Re: スレッドとstatic変数の関係について

Yasuo Ohgaki yohgaki @ ohgaki.net
2007年 7月 3日 (火) 10:29:09 JST


大垣です。

すでに解決済みですが、static変数はマルチスレッドサーバでもマルチプロセス
サーバでも安全に利用できます。

kanonbell さんは書きました:
> こんにちは
> 
>> なんか、すげー考え過ぎの様な気がします。
> 
> まあそれは私も同意。
> でもまあ、「その辺は勝手にやってくれるから気にしなくていいよ」は
> 常に考慮に入れる必要のある言語を使っていた人にとっては
> 非常に座りが悪い思いをするみたいで。
> 変数の型の自動変換とかもそうですね。
> 
>> しかし、標準提供されてる、ライブラリぐらいは、スレッドセーフだと
>> 思います。
> 
> 大垣さんのブログとか拝見すると結構いい加減だなあとか思わないでも
> ないですけどね。

まず、標準提供されているライブラリ全てがスレッドセーフか?ということですが
Cのライブラリ自体がスレッドセーフでない場合もあります。個人的に身近な例で
言えば、セキュリティ対策のためlibpqがスレッドセーフでなくなり文字エンコー
ディング設定がプログラムの動作中に別のスレッドにより書き換えられる可能性
があったりしました。
# Multithreadサーバ(IIS、Zeus、WindowsのApacheなど)以外であれば
# 影響は受けません。
使用しているライブラリ自体がスレッドセーフで無い場合、モジュールレベルで
は対策はされていない事が普通だと思います。普通は困らない(通常の使用状況
では問題が発生しないので気がつかない)状態になっていると思います。

既に同じ事が書かれていますが、PHPにはスレッドセーフモード(Zend Thread
Safety Mode)はマルチスレッドサーバ上でPHPがスレッドセーフで利用できるよう
な仕組みを提供します。前述の通りCライブラリレベルでスレッドセーフでない
場合、問題が発生する可能性はありますが、PHPのstatic変数、グローバル変数、
PHPの設定、モジュールの設定、などはWebサーバがマルチスレッドなのかマルチ
タスクなのか気にしないでコーディングできるようになっています。
# 仮にCライブラリはスレッドセーフでなくても、PHPのモジュールのコードは
# スレッドセーフになっているのでモジュールの設定も安心して変更できます。

「結構いい加減」な実装になっている部分もありますが、普通はマルチプロセス
サーバ(つまり非ZTSモード)でPHPを使う事が多いと思われるので開発者の中で
はあまり問題とされていないです。

まとめると、PHPをマルチスレッド、マルチプロセスサーバのどちらで使ってい
ても(通常は)プログラマが何か気をつけてコーディングする必要はありません。

-- 
Yasuo Ohgaki : yohgaki @ ohgaki.net : http://www.ohgaki.net/



PHP-users メーリングリストの案内