#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 时发生访问冲突。看了好长时间也不知道怎样解决,请求一下帮助,谢谢了
#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 时发生访问冲突。看了好长时间也不知道怎样解决,请求一下帮助,谢谢了
mysql_real_connect()
mysql_close(&mysql);
这些逻辑都放到线程处理 函数里头,它们都是独立的。
不要放到main里头。
明白你的意图了。
mysql_free_result(result);
这个需要在你的线程函数里头,改了以后估计逻辑上应该 正……
另外,这种共享模式,最好能加一些debug语句,方便调试。
明白你的意图了。
mysql_free_result(result);
这个需要在你的线程函数里头,改了以后估计逻辑上应该 正……
另外,这种共享模式,最好能加一些debug语句,方便调试。
加了不知道为什么还是出错,运行了10遍左右,估计能出现一遍正确结构。是不是我加锁加的位置不对。
明白你的意图了。
mysql_free_result(result);
这个需要在你的线程函数里头,改了以后估计逻辑上应该 正……
另外,这种共享模式,最好能加一些debug语句,方便调试。我在好多位置试着加mysql_free_result(result); 但是程序运行还是每次结构都不一样。而且查询出来的结构顺序每次都还不一样?
似乎是同步错误造成的。
主线程中的connect并不能确保一定在其它线程函数执行之前成功执行。从这个思路出发吧,
你可能要加一个等待机制,就是说等连接创建成功之后再运行其它线程的处理函数。