[pgsql-jp: 28784] libpq functions and thread

Satoshi Nagayasu snaga @ snaga.org
2003年 1月 26日 (日) 22:06:04 JST


永安です。

今、ふとしたマルチスレッドプログラムを作っているのですが、
libpqの関数ってthread safeなのでしょうか?

というのは、複数のスレッドを作って、それぞれがPQsetdbLogin()で
コネクションを張るのですが、PQsetdbLogin()の中のconnectDBStart()の中の
memmove()でcoreを吐いてしまいます。

backtrace取るとこんな感じです。

(gdb) bt
#0  0x4207bded in memmove () from /lib/i686/libc.so.6
#1  0x40017aa9 in connectDBStart (conn=0x0) at fe-connect.c:852
#2  0x40017515 in PQsetdbLogin (pghost=0x8052de8 "snaga", 
    pgport=0x8049760 "5432", pgoptions=0x0, pgtty=0x0, 
    dbName=0x8052de8 "snaga", login=0x8052dd8 "snaga", pwd=0x0)
    at fe-connect.c:522
#3  0x08048f64 in runChild () at pgbench3.c:154
#4  0x08049125 in spawnChild (arg=0x0) at pgbench3.c:220
#5  0x4003c941 in pthread_start_thread () from /lib/i686/libpthread.so.0
(gdb) 

なにぶん、スレッドプログラミングに慣れてないので
原因を掴みかねてるのですが、スレッドの数を32とか64とか100とかにすると、
ある時は100スレッドで走るのに、ある時は32スレッドでもcore吐いたりと、
なかなか思うように動いてくれません。

基本的には、指定した個数のスレッドをpthread_create()で作って、
そっちでコネクションを張るようになってます。

スレッドごとにそれぞれオブジェクト(PGconnとか)を作るようにしているので、
他スレッドのあらぬところを勝手に書き換えたり、といったことは、
発生しにくいとは思うのですが、何をもってthread safeと言うのかも
よく分かってないので、どうにも。。

どなたか suggestion がありましたら、よろしくお願いします。

-- 
NAGAYASU Satoshi <snaga @ snaga.org>



pgsql-jp メーリングリストの案内