多线程实例

/***************************************************************************************************************
esql*C 多线程实例,多个线程共享一个context
***************************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include "pthread.h"

#ifdef WIN32
#include <windows.h>
#define SLEEP(a) Sleep(a * 1000)
#else
#define SLEEP(a) sleep(a)
#endif

#define ERR_SQL(err) if( err < 0 )	\
{	\
		sql_error(__LINE__);	\
}

#define SQLCODE sqlca.sqlcode
pthread_mutex_t mutex; 
int fres[10000];
int fcount;
static int fetch_data(sql_context context);

void sql_error(long line)
{
	printf("EXPECTION at line:%ld\n",line);		
	printf("EXPECTION:%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);		
	exit(-1);	
}

//错误处理函数

void test_error(long line)
{
	printf("EXPECTION at line:%ld\n",line);		
	exit(-1);	
}

int main()
{
	pthread_t tid1, tid2;		
	int res = 0;		
	EXEC SQL BEGIN DECLARE SECTION;		
	int i;	
	sql_context context;		
	char username[50];		
	char password[50];		
	char server[50];		
	EXEC SQL END DECLARE SECTION;
	EXEC SQL WHENEVER SQLERROR CONTINUE;	
	fcount = 0;		
	EXEC SQL ENABLE THREADS;		
	EXEC SQL CONTEXT ALLOCATE :context;		
	EXEC SQL CONTEXT USE :context;	
	
	memset(username,0,sizeof(username));	
	memset(password,0,sizeof(password));		
	memset(server,0,sizeof(server));
	
	strcpy(username,"sysdba");		
	strcpy(password,"szoscar55");		
	strcpy(server,"osrdb@127.0.0.1:2003");		
	EXEC SQL CONNECT TO :server USER :username IDENTIFIED BY :password;	
	ERR_SQL(SQLCODE);

	/*创建表之前先删除已经存在的表*/
	EXEC SQL DROP TABLE SHAREONECONN;
	//ERR_SQL(SQLCODE);
	
	res = pthread_mutex_init(&mutex, NULL);  	
	if (res != 0)  
	{  	
		test_error(__LINE__);			 
	}  
	
	/*创建表*/
	EXEC SQL CREATE TABLE SHAREONECONN (name varchar(256), age int);
	if(SQLCODE == 0 )
	{
		printf("创建表SHAREONECONN (name varchar(256), age int) 成功!\n");
	}
	ERR_SQL(SQLCODE);

	for( i=0; i<10; i++ )
	{
		EXEC SQL INSERT INTO SHAREONECONN VALUES ( 'test', :i );				
		ERR_SQL(SQLCODE);
	}
		
	EXEC SQL DECLARE cur_data CURSOR FOR SELECT age FROM SHAREONECONN ORDER BY age;
	ERR_SQL(SQLCODE);

	//打开游标
	EXEC SQL OPEN cur_data;
	ERR_SQL(SQLCODE);
		
	// 创建两个线程 
	if( pthread_create( &tid1,NULL,(void*)fetch_data,(void*)context ) )
	{
		printf( "创建线程失败!\n" );				
		test_error(__LINE__);			
	}

	if( pthread_create( &tid2,NULL,(void*)fetch_data,(void*)context  ) )
	{
		printf( "创建线程失败!\n" );				
		test_error(__LINE__);			
	}

	// 等待线程退出 
	if (pthread_join( tid1,NULL ) )
	{
		printf( "等待线程结束失败!\n" );				
		test_error(__LINE__);
	}

	if (pthread_join( tid2,NULL ) )
	{
		printf( "等待线程结束失败!\n" );				
		test_error(__LINE__);
	}

	EXEC SQL CLOSE cur_data;
	EXEC SQL DROP TABLE SHAREONECONN;		
	EXEC SQL COMMIT WORK RELEASE;		
	ERR_SQL(SQLCODE);
	EXEC SQL CONTEXT FREE :context;
	ERR_SQL(SQLCODE);				
	exit(0);

}

static int fetch_data(sql_context context)
{
	EXEC SQL BEGIN DECLARE SECTION;		
	int age;		
	EXEC SQL END DECLARE SECTION;		
	while(1)
	{		
		if (10 <= fcount)			
		{			
			break;				
		}			
		pthread_mutex_lock(&mutex); 
				 
		//取数据			
		EXEC SQL FETCH cur_data INTO :age;			
		ERR_SQL(SQLCODE);			
		fres[fcount] = age;			
		fcount++;			
		pthread_mutex_unlock(&mutex);			
		SLEEP(1);			
	}
	return 0;
}