求指点:关于LINUX C MYSQL多线程编程问题

pygmalion 2012-08-14 03:02:16
本人遇到一个蛋疼的问题,要开启10000个线程来向数据库插入数据。以下是代码:


#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <syslog.h>
#include <unistd.h>
#include <time.h>
#include <math.h>
#include "/usr/local/mysql/include/mysql.h"

#define NTHREADS 300
#define PREMAX 300


pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
void *thread_fun(void *);

const char *db_host = "localhost";
const char *db_user = "root";
const char *db_pass = "linkpower";
const char *db_name = "lprcms_wn";

void log_error(char *msg)
{
FILE *fd;
fd = fopen("file.txt", "a+");
if (fd){
fputs(msg, fd);
fclose(fd);
}
}

void main()
{
pthread_t thread_id[NTHREADS];
int i;
int j;
int k;
int times;
int start = time(NULL);

mysql_library_init(0,NULL,NULL);

times = ceil(NTHREADS / PREMAX);

for(i = 0; i < times; i++){
for( k = PREMAX * i; k < PREMAX * (i + 1); k++){
pthread_create(&thread_id[k], NULL, thread_fun, &k);
}
for(k = PREMAX * i; k < PREMAX * (i + 1); k++){
pthread_join(thread_id[k], NULL);
}
usleep(400000);
int middle = time(NULL);
int mid_diff = middle - start;
printf("Middle Diff:%d\n", mid_diff);
}
mysql_library_end();

int end = time(NULL);
int diff = end - start;
printf("Diff:%d\n", diff);
}

void *thread_fun(void *ptr)
{

int *tag;
tag = (int *)ptr;
//printf("Thread NO%d. %ld \n", *tag, pthread_self());
int c = 0;
int flag = 0;


MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;

pthread_mutex_lock(&mutex1);
if(conn = mysql_init(NULL)){
if(NULL != mysql_real_connect(conn, db_host, db_user, db_pass, db_name, 0, NULL, 0)){
if(0 == mysql_query(conn, "INSERT INTO demo1(indexVal) VALUES ('1')")){
res = mysql_store_result(conn);
mysql_free_result(res);
} else {
log_error((char *)tag);
//usleep(1000);
}
}
else{
char *msg1 = "Connect error! \n";
printf("Pthread NO. %d \n", counter);
//usleep(1000);
log_error(msg1);
msg1 = NULL;
}
}
else {
char *e_msg = "INITIAL ERROR! \n";
log_error(e_msg);
e_msg = NULL;
}
pthread_mutex_unlock(&mutex1);
mysql_close(conn);
mysql_thread_end();
pthread_exit( (void *)0 );
}


虽然插入成功,但是耗时1000秒左右。感觉效率有点低,求高人指点。如何改进使得耗时减少?
...全文
252 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-08-15
  • 打赏
  • 举报
回复
配置mysql增加连接数>1000,去掉你的程序mutex,每个线程一个mysql连接,由mysql自身的线程池并发1000同时处理各个mysql请求,可以秒杀。

楼主可以自己心思一下,你的所谓的1000个线程根本不如一个线程快,足够愚蠢了。暴露出来的问题就是,你不知道mysql引擎分为myisam/innodb,不知道锁表和锁记录的区别,不知道mysql的架构实现,所以导致你也没意识到自己的程序是假并行。
pygmalion 2012-08-15
  • 打赏
  • 举报
回复
感谢两位指导,很受教!!
结贴吧!
pygmalion 2012-08-14
  • 打赏
  • 举报
回复
谢谢你了先,我想问一下如果不加锁,在线程很多的时候能够保证所有的数据都被写入数据库么?
nice_cxf 2012-08-14
  • 打赏
  • 举报
回复
不但线程多,还加了锁。。。。。根本没必要加锁,
pygmalion 2012-08-14
  • 打赏
  • 举报
回复
哦?
但是300个线程也花了30多秒哦,这个要如何设计才可以提高效率呐
nice_cxf 2012-08-14
  • 打赏
  • 举报
回复
10000个线程?设计不合理,光线程切换就要耗多少时间啊

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧