文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
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
相关阅读 更多 +
排行榜 更多 +
实时多人坦克

实时多人坦克

飞行射击 下载
军团史诗战争

军团史诗战争

飞行射击 下载
极速狂野飞车漂移

极速狂野飞车漂移

飞行射击 下载