- 论坛徽章:
- 1
|
本帖最后由 lewy7 于 2014-09-03 14:00 编辑
请教各位看官,下面这段程序是不是多线程锁用得不对?
如果不用线程的试过,没出问题,但是用线程的话就core dumped,Program terminated with signal 6, Aborted.
(gdb) bt
#0 0x0000003866630265 in raise () from /lib64/libc.so.6
#1 0x0000003866631d10 in abort () from /lib64/libc.so.6
#2 0x000000386666a84b in __libc_message () from /lib64/libc.so.6
#3 0x00000038666722ef in _int_free () from /lib64/libc.so.6
#4 0x000000386667273b in free () from /lib64/libc.so.6
#5 0x00000000004014b8 in queue_del (ptr=0x12166010) at queue.c:134
#6 0x0000000000400cb5 in consume (parameter=0x12166010) at main.c:74
#7 0x00000038672064a7 in start_thread () from /lib64/libpthread.so.0
#8 0x00000038666d3c2d in clone () from /lib64/libc.so.6- pthread_mutex_t locker= PTHREAD_MUTEX_INITIALIZER;
- pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- void produce(httpq_queue_t *que)
- {
- char data[100];
- int i=9999;
- while(i-->0){
- pthread_mutex_lock(&locker);
- str_timestamp(data); //取微秒级的时间字符串
- if( 0 > queue_push(que,i,(void *)data,strlen(data)+1)) //加入队列
- {
- fprintf(stderr, "Error: %s:%d\n", __FILE__, __LINE__);
- }
- pthread_cond_signal(&cond); //发送信号给consume线程
- pthread_mutex_unlock(&locker);
- }
- }
- void *consume(void *parameter)
- {
- char data[100];
- int i=0;
- int j;
- httpq_queue_t *que;
- que=(httpq_queue_t *)parameter;
- httpq_quedata_t *container;
- pthread_mutex_lock(&locker);
- while(1){
- pthread_cond_wait(&cond, &locker);
- container=(httpq_quedata_t *)malloc(sizeof(httpq_quedata_t)*que->size);
- j=que->size;//当前队列总数
- while(j-- > 0)
- {
- queue_struct_pop(que,container+i);//复制出队列头数据
- queue_del(que);//删除队列头数据,这个地方段错误了
- i++;
- }
- free(container);//释放
- usleep(1000);
- pthread_mutex_unlock(&locker);
- }
- }
- int main()
- {
- httpq_queue_t *que;
- que=NULL;
- create_queue(&que,"quename",999999);//创建一个最大999999的队列
-
- pthread_mutex_init (&locker,NULL);
- pthread_t consumer_thread;
- pthread_create(&consumer_thread, NULL, consume, (void *)que);
-
- produce(que);
- pthread_join(consumer_thread,NULL);
- return 0;
- }
复制代码 |
|