[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 メーリングリストの案内