thread-thread.c
来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 215 行
C
215 行
/* Processed by ecpg (regression mode) *//* These include files are added by the preprocessor */#include <ecpgtype.h>#include <ecpglib.h>#include <ecpgerrno.h>#include <sqlca.h>/* End of automatic include section */#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))#line 1 "thread.pgc"/* * Thread test program * by Philip Yarra & Lee Kindness. */#include <stdlib.h>#include "ecpg_config.h"#ifndef ENABLE_THREAD_SAFETYintmain(void){ printf("No threading enabled.\n"); return 0;}#else#ifndef WIN32#include <pthread.h>#else#include <windows.h>#endif#line 1 "regression.h"#line 22 "thread.pgc"void *test_thread(void *arg);int nthreads = 10;int iterations = 20;int main(int argc, char *argv[]){#ifndef WIN32 pthread_t *threads;#else HANDLE *threads;#endif int n; /* exec sql begin declare section */ #line 38 "thread.pgc" int l_rows ;/* exec sql end declare section */#line 39 "thread.pgc" /* Do not switch on debug output for regression tests. The threads get executed in * more or less random order */ /* ECPGdebug(1, stderr); */ /* setup test_thread table */ { ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , NULL, 0); }#line 46 "thread.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread ", ECPGt_EOIT, ECPGt_EORT);}#line 47 "thread.pgc" /* DROP might fail */ { ECPGtrans(__LINE__, NULL, "commit");}#line 48 "thread.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast( timeofday () as timestamp ) , thread text not null , iteration integer not null , primary key( thread , iteration ) ) ", ECPGt_EOIT, ECPGt_EORT);}#line 53 "thread.pgc" { ECPGtrans(__LINE__, NULL, "commit");}#line 54 "thread.pgc" { ECPGdisconnect(__LINE__, "CURRENT");}#line 55 "thread.pgc" /* create, and start, threads */ threads = calloc(nthreads, sizeof(threads[0])); if( threads == NULL ) { fprintf(stderr, "Cannot alloc memory\n"); return( 1 ); } for( n = 0; n < nthreads; n++ ) {#ifndef WIN32 pthread_create(&threads[n], NULL, test_thread, (void *) (long) (n + 1));#else threads[n] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)test_thread, (void *) (n + 1), 0, NULL);#endif } /* wait for thread completion */#ifndef WIN32 for( n = 0; n < nthreads; n++ ) { pthread_join(threads[n], NULL); }#else WaitForMultipleObjects(nthreads, threads, TRUE, INFINITE);#endif free(threads); /* and check results */ { ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , NULL, 0); }#line 85 "thread.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count (*) from test_thread ", ECPGt_EOIT, ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);}#line 86 "thread.pgc" { ECPGtrans(__LINE__, NULL, "commit");}#line 87 "thread.pgc" { ECPGdisconnect(__LINE__, "CURRENT");}#line 88 "thread.pgc" if( l_rows == (nthreads * iterations) ) printf("Success.\n"); else printf("ERROR: Failure - expecting %d rows, got %d.\n", nthreads * iterations, l_rows); return( 0 );}void *test_thread(void *arg){ long threadnum = (long)arg; /* exec sql begin declare section */ #line 101 "thread.pgc" int l_i ; #line 102 "thread.pgc" char l_connection [ 128 ] ;/* exec sql end declare section */#line 103 "thread.pgc" /* build up connection name, and connect to database */#ifndef WIN32_ONLY_COMPILER snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum);#else _snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum);#endif /* exec sql whenever sqlerror sqlprint ; */#line 111 "thread.pgc" { ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , l_connection, 0); #line 112 "thread.pgc"if (sqlca.sqlcode < 0) sqlprint();}#line 112 "thread.pgc" if( sqlca.sqlcode != 0 ) { printf("%s: ERROR: cannot connect to database!\n", l_connection); return( NULL ); } { ECPGtrans(__LINE__, l_connection, "begin transaction ");#line 118 "thread.pgc"if (sqlca.sqlcode < 0) sqlprint();}#line 118 "thread.pgc" /* insert into test_thread table */ for( l_i = 1; l_i <= iterations; l_i++ ) { { ECPGdo(__LINE__, 0, 1, l_connection, 0, ECPGst_normal, "insert into test_thread ( thread , iteration ) values ( $1 , $2 ) ", ECPGt_char,(l_connection),(long)128,(long)1,(128)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);#line 123 "thread.pgc"if (sqlca.sqlcode < 0) sqlprint();}#line 123 "thread.pgc" if( sqlca.sqlcode != 0 ) printf("%s: ERROR: insert failed!\n", l_connection); } /* all done */ { ECPGtrans(__LINE__, l_connection, "commit");#line 129 "thread.pgc"if (sqlca.sqlcode < 0) sqlprint();}#line 129 "thread.pgc" { ECPGdisconnect(__LINE__, l_connection);#line 130 "thread.pgc"if (sqlca.sqlcode < 0) sqlprint();}#line 130 "thread.pgc" return( NULL );}#endif /* ENABLE_THREAD_SAFETY */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?