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

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 30章libpq - C ライブラリ | 早送り | 次のページ

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

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

`PQisthreadsafe`

  libpqライブラリのスレッド安全性状態を返します。

             int PQisthreadsafe();

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

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

`PGresult` オブジェクトは生成後、読み込み専用となります。 従って、スレッド間を自由に渡ることができます。

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

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

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

前のページ | ホーム | 次のページ
SSLサポート | 上に戻る | libpqプログラムの構築