【发布时间】:2009-12-16 13:54:34
【问题描述】:
我编写了一个简单的多线程 C 程序来访问 MySQL,它工作正常,除了 当 我在每个线程函数中添加了 usleep() 或 sleep() 函数。 我在 main 方法中创建了两个 pthread,
int main(){
mysql_library_init(0,NULL,NULL);
printf("Hello world!\n");
init_pool(&p,100);
pthread_t producer;
pthread_t consumer_1;
pthread_t consumer_2;
pthread_create(&producer,NULL,produce_fun,NULL);
pthread_create(&consumer_1,NULL,consume_fun,NULL);
pthread_create(&consumer_2,NULL,consume_fun,NULL);
mysql_library_end();
}
void * produce_fun(void *arg){
pthread_detach(pthread_self());
//procedure
while(1){
usleep(500000);
printf("producer...\n");
produce(&p,cnt++);
}
pthread_exit(NULL);
}
void * consume_fun(void *arg){
pthread_detach(pthread_self());
MYSQL db;
MYSQL *ptr_db=mysql_init(&db);
mysql_real_connect();
//procedure
while(1){
usleep(1000000);
printf("consumer...");
int item=consume(&p);
addRecord_d(ptr_db,"test",item);
}
mysql_thread_end();
pthread_exit(NULL);
}
void addRecord_d(MYSQL *ptr_db,const char *t_name,int item){
char query_buffer[100];
sprintf(query_buffer,"insert into %s values(0,%d)",t_name,item);
//pthread_mutex_lock(&db_t_lock);
int ret=mysql_query(ptr_db,query_buffer);
if(ret){
fprintf(stderr,"%s%s\n","cannot add record to ",t_name);
return;
}
unsigned long long update_id=mysql_insert_id(ptr_db);
// pthread_mutex_unlock(&db_t_lock);
printf("add record (%llu,%d) ok.",update_id,item);
}
程序输出错误如下:
[Thread debugging using libthread_db enabled]
[New Thread 0xb7ae3b70 (LWP 7712)]
Hello world!
[New Thread 0xb72d6b70 (LWP 7713)]
[New Thread 0xb6ad5b70 (LWP 7714)]
[New Thread 0xb62d4b70 (LWP 7715)]
[Thread 0xb7ae3b70 (LWP 7712) exited]
producer...
producer...
consumer...consumer...add record (31441,0) ok.add record (31442,1) ok.producer...
producer...
consumer...consumer...add record (31443,2) ok.add record (31444,3) ok.producer...
producer...
consumer...consumer...add record (31445,4) ok.add record (31446,5) ok.producer...
producer...
consumer...consumer...add record (31447,6) ok.add record (31448,7) ok.producer...
Error in my_thread_global_end(): 2 threads didn't exit
[Thread 0xb72d6b70 (LWP 7713) exited]
[Thread 0xb6ad5b70 (LWP 7714) exited]
[Thread 0xb62d4b70 (LWP 7715) exited]
Program exited normally.
当我在函数 addRecord_d 中添加 pthread_mutex_lock 时,错误仍然存在。 那么究竟是什么问题呢?
【问题讨论】:
标签: mysql c multithreading pthreads