MySQL多线程
时间:2010-04-12 来源:ubuntuer
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include "mysql.h" const char* host = "localhost";
const char* user = "root";
const char* password = "123456";
const char* database = "test"; static unsigned int thread_count;
static unsigned int number_of_tests=10;
static unsigned int number_of_threads=2;
static pthread_cond_t COND_thread_count;
static pthread_mutex_t LOCK_thread_count; void* test_thread(void *arg)
{
MYSQL *mysql;
MYSQL_ROW row;
int t;
unsigned int count;
char query[50];
int flag = *((int *)arg);
//pthread_mutex_lock(&LOCK_thread_count);
mysql=mysql_init(NULL);
if (!mysql_real_connect(mysql,host,user,password,database, 0, NULL, 0))
{
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(mysql));
goto end;
}
mysql->reconnect= 1;
for (count=0 ; count < number_of_tests ; count++)
{
MYSQL_RES *res;
if(flag&1)
sprintf(query, "insert into thread values(%d)", count+1);
else
sprintf(query, "select * from thread where id=%d", count+1);
printf("query is %s\n", query);
if (mysql_query(mysql,query))
{
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
goto end;
}
if((flag&1)==0)
{
if (!(res=mysql_store_result(mysql)))
{
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(mysql));
goto end;
}
while((row = mysql_fetch_row(res))!=NULL)
{
for(t=0;t<mysql_num_fields(res);t++)
printf("%s ",row[t]);
printf("\n");
}
mysql_free_result(res);
}
}
//pthread_mutex_unlock(&LOCK_thread_count);
end:
mysql_close(mysql);
pthread_mutex_lock(&LOCK_thread_count);
thread_count--;
pthread_cond_signal(&COND_thread_count); /* Tell main we are ready */
pthread_mutex_unlock(&LOCK_thread_count);
pthread_exit(0);
return NULL;
}
int main(int argc, char **argv)
{
pthread_t tid;
pthread_attr_t thr_attr;
unsigned int i;
int error;
if ((error=pthread_cond_init(&COND_thread_count,NULL)))
{
fprintf(stderr,"Got error: %d from pthread_cond_init (errno: %d)",error,errno);
exit(1);
}
pthread_mutex_init(&LOCK_thread_count,NULL); if ((error=pthread_attr_init(&thr_attr)))
{
fprintf(stderr,"Got error: %d from pthread_attr_init (errno: %d)",
error,errno);
exit(1);
}
if ((error=pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED)))
{
fprintf(stderr,
"Got error: %d from pthread_attr_setdetachstate (errno: %d)",
error,errno);
exit(1);
} printf("Init ok. Creating %d threads\n",number_of_threads);
for (i=1 ; i <= number_of_threads ; i++)
{
int *param= (int *)&i; pthread_mutex_lock(&LOCK_thread_count);
if ((error=pthread_create(&tid,&thr_attr,test_thread,(void*) param)))
{
fprintf(stderr,"\nGot error: %d from pthread_create (errno: %d) when creating thread: %i\n",
error,errno,i);
pthread_mutex_unlock(&LOCK_thread_count);
exit(1);
}
thread_count++;
pthread_mutex_unlock(&LOCK_thread_count);
} printf("Waiting for threads to finnish\n");
error=pthread_mutex_lock(&LOCK_thread_count);
while (thread_count)
{
if ((error=pthread_cond_wait(&COND_thread_count,&LOCK_thread_count)))
fprintf(stderr,"\nGot error: %d from pthread_cond_wait\n",error);
}
pthread_mutex_unlock(&LOCK_thread_count);
pthread_attr_destroy(&thr_attr);
pthread_cond_destroy(&COND_thread_count);
pthread_mutex_destroy(&LOCK_thread_count); return 0; /* Keep some compilers happy */
}
编译执行结果
[root@kenthy mysql]# gcc -Wall -I/usr/include/mysql -o mysql_thread mysql_thread.c -L/usr/lib/mysql/ -lmysqlclient
[root@kenthy mysql]# ./mysql_thread
Init ok. Creating 2 threads
Waiting for threads to finnish
query is insert into thread values(1)
query is insert into thread values(2)
query is insert into thread values(3)
query is insert into thread values(4)
query is insert into thread values(5)
query is insert into thread values(6)
query is insert into thread values(7)
query is insert into thread values(8)
query is insert into thread values(9)
query is insert into thread values(10)
query is select * from thread where id=1
1
query is select * from thread where id=2
2
query is select * from thread where id=3
3
query is select * from thread where id=4
4
query is select * from thread where id=5
5
query is select * from thread where id=6
6
query is select * from thread where id=7
7
query is select * from thread where id=8
8
query is select * from thread where id=9
9
query is select * from thread where id=10
10
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include "mysql.h" const char* host = "localhost";
const char* user = "root";
const char* password = "123456";
const char* database = "test"; static unsigned int thread_count;
static unsigned int number_of_tests=10;
static unsigned int number_of_threads=2;
static pthread_cond_t COND_thread_count;
static pthread_mutex_t LOCK_thread_count; void* test_thread(void *arg)
{
MYSQL *mysql;
MYSQL_ROW row;
int t;
unsigned int count;
char query[50];
int flag = *((int *)arg);
//pthread_mutex_lock(&LOCK_thread_count);
mysql=mysql_init(NULL);
if (!mysql_real_connect(mysql,host,user,password,database, 0, NULL, 0))
{
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(mysql));
goto end;
}
mysql->reconnect= 1;
for (count=0 ; count < number_of_tests ; count++)
{
MYSQL_RES *res;
if(flag&1)
sprintf(query, "insert into thread values(%d)", count+1);
else
sprintf(query, "select * from thread where id=%d", count+1);
printf("query is %s\n", query);
if (mysql_query(mysql,query))
{
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
goto end;
}
if((flag&1)==0)
{
if (!(res=mysql_store_result(mysql)))
{
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(mysql));
goto end;
}
while((row = mysql_fetch_row(res))!=NULL)
{
for(t=0;t<mysql_num_fields(res);t++)
printf("%s ",row[t]);
printf("\n");
}
mysql_free_result(res);
}
}
//pthread_mutex_unlock(&LOCK_thread_count);
end:
mysql_close(mysql);
pthread_mutex_lock(&LOCK_thread_count);
thread_count--;
pthread_cond_signal(&COND_thread_count); /* Tell main we are ready */
pthread_mutex_unlock(&LOCK_thread_count);
pthread_exit(0);
return NULL;
}
int main(int argc, char **argv)
{
pthread_t tid;
pthread_attr_t thr_attr;
unsigned int i;
int error;
if ((error=pthread_cond_init(&COND_thread_count,NULL)))
{
fprintf(stderr,"Got error: %d from pthread_cond_init (errno: %d)",error,errno);
exit(1);
}
pthread_mutex_init(&LOCK_thread_count,NULL); if ((error=pthread_attr_init(&thr_attr)))
{
fprintf(stderr,"Got error: %d from pthread_attr_init (errno: %d)",
error,errno);
exit(1);
}
if ((error=pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED)))
{
fprintf(stderr,
"Got error: %d from pthread_attr_setdetachstate (errno: %d)",
error,errno);
exit(1);
} printf("Init ok. Creating %d threads\n",number_of_threads);
for (i=1 ; i <= number_of_threads ; i++)
{
int *param= (int *)&i; pthread_mutex_lock(&LOCK_thread_count);
if ((error=pthread_create(&tid,&thr_attr,test_thread,(void*) param)))
{
fprintf(stderr,"\nGot error: %d from pthread_create (errno: %d) when creating thread: %i\n",
error,errno,i);
pthread_mutex_unlock(&LOCK_thread_count);
exit(1);
}
thread_count++;
pthread_mutex_unlock(&LOCK_thread_count);
} printf("Waiting for threads to finnish\n");
error=pthread_mutex_lock(&LOCK_thread_count);
while (thread_count)
{
if ((error=pthread_cond_wait(&COND_thread_count,&LOCK_thread_count)))
fprintf(stderr,"\nGot error: %d from pthread_cond_wait\n",error);
}
pthread_mutex_unlock(&LOCK_thread_count);
pthread_attr_destroy(&thr_attr);
pthread_cond_destroy(&COND_thread_count);
pthread_mutex_destroy(&LOCK_thread_count); return 0; /* Keep some compilers happy */
}
编译执行结果
[root@kenthy mysql]# gcc -Wall -I/usr/include/mysql -o mysql_thread mysql_thread.c -L/usr/lib/mysql/ -lmysqlclient
[root@kenthy mysql]# ./mysql_thread
Init ok. Creating 2 threads
Waiting for threads to finnish
query is insert into thread values(1)
query is insert into thread values(2)
query is insert into thread values(3)
query is insert into thread values(4)
query is insert into thread values(5)
query is insert into thread values(6)
query is insert into thread values(7)
query is insert into thread values(8)
query is insert into thread values(9)
query is insert into thread values(10)
query is select * from thread where id=1
1
query is select * from thread where id=2
2
query is select * from thread where id=3
3
query is select * from thread where id=4
4
query is select * from thread where id=5
5
query is select * from thread where id=6
6
query is select * from thread where id=7
7
query is select * from thread where id=8
8
query is select * from thread where id=9
9
query is select * from thread where id=10
10
相关阅读 更多 +