無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

31.19. スレッド化プログラムの振舞い

デフォルトで libpq は再入可能、かつ、スレッドセーフです。 アプリケーションコードをコンパイルする時にコンパイラの特殊なコマンドラインオプションに追加する必要があるかもしれません。 スレッドを有効にしたアプリケーションの構築方法についての情報は、使用するシステムの文書を参照してください。 また、 PTHREAD_CFLAGS PTHREAD_LIBS に関して src/Makefile.global も一読してください。 以下の関数により、 libpq のスレッドセーフ状態を確認することができます。

PQisthreadsafe

libpq ライブラリのスレッドセーフ状態を返します。

int PQisthreadsafe();

libpq がスレッドセーフの場合1が、さもなくば0が返ります。

スレッドに関する1つの制限として、異なるスレッドから同時に同一の PGconn オブジェクトを操作することはできません。 具体的には、異なるスレッドから同一接続オブジェクトを介してコマンドを同時に発行することができません。 (コマンドの同時実行が必要な場合、接続を複数使用してください。)

PGresult オブジェクトは生成後、読み込み専用であり、そのためスレッド間で自由に渡すことができます。 しかし 項31.11 項31.13 で説明する PGresult を変更する関数のいずれかを使用している場合、同一の PGresult に対する同時操作を防ぐことも、作成者の責任です。

非推奨の関数、 PQrequestCancel PQoidStatus はスレッドセーフではありませんので、マルチスレッドプログラムでは使用してはなりません。 PQrequestCancel PQcancel に、 PQoidStatus PQoidValue に置き換えることができます。

( libpq の内部に加えて)アプリケーション中でKerberosを利用している場合、Kerberos関数はスレッドセーフではありませんのでKerberos呼び出しの前後をロックする必要があるでしょう。 libpq とアプリケーション間のロック処理を協調させる方法として libpq のソースコードの PQregisterThreadLock 関数を参照してください。

スレッドアプリケーションで問題が起きた場合、 src/tools/thread 内のプログラムを実行して、プラットフォームがスレッドセーフではない関数を持っていないかどうか確認してください。 このプログラムは configure より実行されますが、バイナリ配布物の場合は、バイナリ構築時のライブラリとシステムのライブラリが一致しない可能性があります。


powered by SEO.CUG.NET