#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <mysql.h>
#include <windows.h>void *thread_fun(void *);
pthread_mutex_t mutex1;
MYSQL mysql;  
MYSQL_RES * result;                       
MYSQL_ROW row;   int  main()
{
     const char * host = "127.0.0.1"; 
     const char * user = "root";      
     const char * passwd = "123456";
     const char * db = "testmysql";     
     int i;
     MYSQL mysql;
     pthread_t thread_id[10];
     if(mysql_init(&mysql)==NULL)
          return -1;     mysql_thread_init();      if (  mysql_real_connect(&mysql, host, "root", "123456", "testmysql", 0, NULL, 0)  == NULL )
     {
          printf("connect error: \n");
          fprintf(stderr, " %s\n", mysql_error(&mysql));
          exit(1);
     }
     else
     {
          fprintf(stderr, "connect success.\n");
     }
    
     for( i = 0; i < 10; i++)
     {
         
          pthread_create(&thread_id[i], NULL, thread_fun, NULL);
         
     }
     for(i = 0; i <  10 ; i++)
     {
          pthread_join(thread_id[i], NULL);
     }     mysql_close(&mysql);
     mysql_free_result(result);                        
     mysql_thread_end();
     return 0;}void *thread_fun(void *ptr)
{
      MYSQL mysql;
     pthread_mutex_init(&mutex1,NULL);

     const char * i_query = "select * from children";
    
     pthread_mutex_lock(&mutex1);
     if ( mysql_query(&mysql, i_query) != 0 )     
     {
          fprintf(stderr, "query error.\n");
          exit(1);
     }
     else
     {
          if ( (result = mysql_store_result(&mysql)) == NULL )
        {
                fprintf(stderr, "store error.\n");
                exit(1);
        }
        else
        {
          while ( (row = mysql_fetch_row(result)) != NULL )
          {
               printf("id is %s\t",row[0]);
               printf("name is %s\t", row[1]);             
               printf("age is %s\t\n", row[2]);             
          }
        }
       }  pthread_mutex_unlock(&mutex1);      return 0;
}
程序一运行就出错了,弹出错误信息是0x5e3389bf 处未处理的异常: 0xC0000005: 读取位置 0xccccccd0 时发生访问冲突。看了好长时间也不知道怎样解决,请求一下帮助,谢谢了

解决方案 »

  1.   

    刚刚发现,把main函数中的MYSQL   mysql初始化语句去掉,就能运行了,但是还是出错,而且每次运行结果都不一样?
      

  2.   

    (mysql_init(&mysql)==NULL)
    mysql_real_connect()
    mysql_close(&mysql);
    这些逻辑都放到线程处理 函数里头,它们都是独立的。
    不要放到main里头。
      

  3.   

    如果把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在线程处理函数中,这样在for循环的时候就会建立多个连接,我想只建立一个连接,共享单个连接,所以把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在main()函数中,这样就能建立一次连接然后用多次。
      

  4.   

    如果把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在线程处理函数中,这样在for循环的时候就会建立多个连接,我想只建立一个连接,共享单个连接,所以把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在main()函数中,这样就能建立一次连接然后用多次。共享连接模式?
    明白你的意图了。
    mysql_free_result(result); 
    这个需要在你的线程函数里头,改了以后估计逻辑上应该 正……
    另外,这种共享模式,最好能加一些debug语句,方便调试。
      

  5.   

    如果把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在线程处理函数中,这样在for循环的时候就会建立多个连接,我想只建立一个连接,共享单个连接,所以把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在main()函数中,这样就能建立一次连接然后用多次。共享连接模式?
    明白你的意图了。
    mysql_free_result(result); 
    这个需要在你的线程函数里头,改了以后估计逻辑上应该 正……
    另外,这种共享模式,最好能加一些debug语句,方便调试。
    加了不知道为什么还是出错,运行了10遍左右,估计能出现一遍正确结构。是不是我加锁加的位置不对。
      

  6.   

    如果把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在线程处理函数中,这样在for循环的时候就会建立多个连接,我想只建立一个连接,共享单个连接,所以把(mysql_init(&mysql)==NULL)和mysql_real_connect()放在main()函数中,这样就能建立一次连接然后用多次。共享连接模式?
    明白你的意图了。
    mysql_free_result(result); 
    这个需要在你的线程函数里头,改了以后估计逻辑上应该 正……
    另外,这种共享模式,最好能加一些debug语句,方便调试。我在好多位置试着加mysql_free_result(result); 但是程序运行还是每次结构都不一样。而且查询出来的结构顺序每次都还不一样?
      

  7.   

    重新看了一遍你的代码,
    似乎是同步错误造成的。
    主线程中的connect并不能确保一定在其它线程函数执行之前成功执行。从这个思路出发吧,
    你可能要加一个等待机制,就是说等连接创建成功之后再运行其它线程的处理函数。