LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1363|回复: 1

多线程操作MYSQL,但如何保证有效保证各线程轮换?

[复制链接]
发表于 2006-2-21 21:24:59 | 显示全部楼层 |阅读模式
在debian下写了个接入mysql进行读写操作的程序,代码附后。虽然对单独的线程都在运行后延时了一会让它不霸占,但实际运行起来还是很容易被tread1,特别是thread3霸占,请问如何能让四个线程比较公平的使用资源,谢谢

  #include <mysql.h>
  #include <stdio.h>
  #include <pthread.h>
  #include <unistd.h>
  
   MYSQL mysql;     
   MYSQL_RES *res;
   MYSQL_ROW row;
   char *query;
   int t;
   pthread_mutex_t my_mutex;
   pthread_mutex_init(my_mutex);
   struct timespec delay;
   delay.tv_sec = 1;
   delay.tv_nec = 0;
   void Myupdate();
   void Myupdate2();
   void Myselect();
   void Myselect2();

  
  int main()
{
        pthread_t thread1,thread3,thread2,thread4;
        int  iret1,iret2,iret3,iret4;
       
    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql,"localhost", "test", "test", "test",0,NULL,0))
    {
        printf( "Error connecting to database: %s\n",mysql_error(&mysql));
                 return 1;
    }
    else printf("Connected...\n");

   
    iret1= pthread_create( &thread1, NULL, Myupdate, NULL);
    iret2= pthread_create( &thread2, NULL, Myupdate2, NULL);
    iret3= pthread_create( &thread3, NULL, Myselect, NULL);
    iret4= pthread_create( &thread4, NULL, Myselect2, NULL);
    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL);
    pthread_join( thread3, NULL);
    pthread_join( thread4, NULL);
   
        mysql_close(&mysql);
    return 0;
}

void Myselect()
{  while(1)
        {
        pthread_mutex_lock(&my_mutex);
         query = "select * from ttable where id=1";
   
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
    printf("Error making query: %s\n",
    mysql_error(&mysql));
        return 1;
}
else printf("[%s] made...\n", query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
  for(t=0;t<mysql_num_fields(res);t++)
  {
   printf("%s ",row[t]);
  }
  printf("\n");
}
printf("mysql_free_result...\n");
mysql_free_result(res);  
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}
}

void Myselect2()
{  while(1)
        {
                pthread_mutex_lock(&my_mutex);
         query = "select * from ttable where id=2";
   
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
    printf("Error making query: %s\n",
    mysql_error(&mysql));
         return 1;
}
else printf("[%s] made...\n", query);
res = mysql_store_result(&mysql);
while(row = mysql_fetch_row(res))
{
  for(t=0;t<mysql_num_fields(res);t++)
  {
   printf("%s ",row[t]);
  }
  printf("\n");
}
printf("mysql_free_result...\n");
mysql_free_result(res);  
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}

}


void Myupdate()
{while(1)
        {
pthread_mutex_lock(&my_mutex);
query = "insert into ttable(id, value) values(1, 'Update from thread 1')";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
    printf("Error making query: %s\n",
     mysql_error(&mysql));
         return 1;
}
else printf("[%s] made...\n", query);
  pthread_mutex_unlock(&my_mutex);
  pthread_delay_np(&delay);
}
}

void Myupdate2()
{while(1)
        {
pthread_mutex_lock(&my_mutex);
query = "insert into ttable(id, value) values(2, 'Update from thread 2')";
t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if (t)
{
    printf("Error making query: %s\n",
    mysql_error(&mysql));
         return 1;
}
else printf("[%s] made...\n", query);
pthread_mutex_unlock(&my_mutex);
pthread_delay_np(&delay);
}
}
发表于 2006-2-22 09:12:04 | 显示全部楼层
一个建议是mysql_store_result()之后就可以解锁了。
另一个建议是,连接时使用-lmysqlclient_r
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表