文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>MySQL多线程

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
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载