linux oracle 多线程里连接数据库过一段就出现“段异常”

linux oracle 多线程里连接数据库过一段就出现“段错误”
以下是测试代码,程序运行一段时间以后就出现段错误,如果把OCILogon那一行代码注释起来就没事了。
这该如何解决呢?难道oracle就不支持在多线程里同时连接数据库。


#include <string.h>
#include <wchar.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <sys/time.h>
#include <semaphore.h>

#include <iostream>
#include <string>
#include <map>

using namespace std;

#include <oci.h>
#pragma comment(lib,"libclntsh.so")



bool g_flag = true;

void * thread_func( void * lpParam )
{

sword status = -1;

OCIEnv * envhp = NULL; // 环境句柄
OCIServer * svrhp = NULL; // 服务器句柄
OCIError * errhp = NULL; // 错误句柄
OCISvcCtx * svchp = NULL; // 服务上下文句柄

while( g_flag )
{
//printf( " prepare sleep = %u\n",&pid );
sleep( 1 );

// 创建OCI环境句柄
status = OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL); 
if(status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO )
{
printf( "## OCIEnvCreate failed... ID = \n" );
}
// 分配服务器句柄
status = OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&svrhp,OCI_HTYPE_SERVER, 0, (dvoid **) 0);
if(status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO )
{
printf( "## OCI_HTYPE_SERVER failed... ID = \n" );
}
// 分配错误句柄
status = OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&errhp,OCI_HTYPE_ERROR, 0, (dvoid **) 0);
if(status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO )
{
printf( "## OCI_HTYPE_ERROR failed... ID = \n" );
}
// 分配服务上下文句柄
status = OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&svchp,OCI_HTYPE_SVCCTX, 0, (dvoid **) 0);
if(status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO )
{
printf( "## OCI_HTYPE_SVCCTX failed... ID = \n" );
}

char * username = "gagb";
char * password = "gagb";
char * conn = "(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.201)(PORT = 1521)) )(CONNECT_DATA = (SID = GAGB)))";
status = OCILogon( envhp,errhp,&svchp,(text *)username,(ub4)strlen(username),(text *)password,(ub4)strlen(password),(text *)conn,(ub4)strlen(conn) );
if(status != OCI_SUCCESS && status != OCI_SUCCESS_WITH_INFO )
{
printf( "## OCILogon failed... ID = %u\n",envhp );
}
else
{
sleep( 1 );
OCILogoff( svchp,errhp );
printf( "## OCILogon successed... ID = %u\n",envhp );
}
// 按照顺序依次释放相关句柄
// 释放服务上下文句柄
if( svchp != NULL )