当前位置: 技术问答>linux和unix
求达人救命.....[程序有些长,请您耐心帮忙看看]
来源: 互联网 发布时间:2016-06-09
本文导语: 程序的功能就是从磁盘上把文件映射进内存,然后为文件中的数据建立一个队列,现在创建了一个线程池,将数据队列作为任务投放到线程池中去, 程序的问题就是在没有将投放到线程池中的数据处理完后,程序就...
程序的功能就是从磁盘上把文件映射进内存,然后为文件中的数据建立一个队列,现在创建了一个线程池,将数据队列作为任务投放到线程池中去,
程序的问题就是在没有将投放到线程池中的数据处理完后,程序就正常退出了!
我的想法就是能让线程池中的线程去读取数据然后知道队列为空,再退出。研究了很久,不知道怎么修改?求达人救命了!!!
程序的问题就是在没有将投放到线程池中的数据处理完后,程序就正常退出了!
我的想法就是能让线程池中的线程去读取数据然后知道队列为空,再退出。研究了很久,不知道怎么修改?求达人救命了!!!
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 100
typedef char* elemType;
typedef struct sNode{
elemType oid;
struct sNode *next;
}Node;
typedef struct{
Node *front;
Node *rear;
}queueLK;
void initQueue(queueLK *hq); //初始化队列
int enQueue(queueLK *hq,elemType objid); //入队操作
elemType outQueue(queueLK *hq); //从队列中删除一个元素
elemType peekQueue(queueLK *hq); //获取队首元素
int emptyQueue(queueLK *hq); //判断队列是否为空
void clearQueue(queueLK *hq); //清除队列
queueLK q; //定义了一个队列
void
initQueue(queueLK *hq)
{
hq->front = hq->rear = NULL;
return;
}
int
enQueue(queueLK *hq,elemType objid)
{
Node *ptr_node;
int len;
ptr_node = malloc(sizeof(Node));
if(ptr_node == NULL){
printf("内存空间分配失败!n");
exit(1);
}
len = strlen(objid);
ptr_node->oid = malloc(len * sizeof(char) + 1);
strncpy(ptr_node->oid,objid,len);
ptr_node->next = NULL;
if(hq->rear == NULL)
hq->front = hq->rear = ptr_node;
else
hq->rear = hq->rear->next = ptr_node;
return 0;
}
elemType
outQueue(queueLK *hq)
{
Node *ptr;
elemType temp;
if(hq->front == NULL){
printf("队列为空,无法删除!n");
exit(1);
}
temp = malloc(strlen(hq->front->oid) + 1);
strncpy(temp,hq->front->oid,strlen(hq->front->oid));
ptr = hq->front;
hq->front = ptr->next;
if(hq->front == NULL)
hq->rear = NULL;
free(ptr);
return temp;
}
elemType
peekQueue(queueLK *hq)
{
if(hq->front == NULL){
printf("队列为空!n");
exit(1);
}
return hq->front->oid;
}
int
emptyQueue(queueLK *hq)
{
if(hq->front == NULL)
return 1;
else
return 0;
}
void
clearQueue(queueLK *hq)
{
Node *ptr = hq->front->next;
while(ptr != NULL){
hq->front = hq->front->next;
free(ptr);
ptr = hq->front;
}
hq->rear = NULL;
return;
}
|
elemType
outQueue(queueLK *hq)
{
Node *ptr;
elemType temp;
if(hq->front == NULL){
printf("队列为空,无法删除!n");
exit(1);
}
temp = malloc(strlen(hq->front->oid) + 1);
strncpy(temp,hq->front->oid,strlen(hq->front->oid));
ptr = hq->front;
hq->front = ptr->next;
if(hq->front == NULL)
hq->rear = NULL;
free(ptr->oid);
free(ptr);
return temp;
}
void
clearQueue(queueLK *hq)
{
Node *ptr = hq->front->next;
while(ptr != NULL){
hq->front = hq->front->next;
free(ptr->oid);
free(ptr);
ptr = hq->front;
}
hq->rear = NULL;
return;
}
|
晕,没必要把事情搞得那么复杂吧,多线程是在分时的情况下运行的,时间片一般都在ms级,考虑到还有别的进程及线程,加起来也不会超过几秒吧,sleep设置个2~3秒,等线程池所有线程都过了shutdown判断就OK啦。 如果想问题复杂,可以信号量同步,等所有线程都过了shutdown,发信号量给主进程,具体就麻烦了,自己去想吧!
|
用gdb吧 先在bash 中输入 gdb 你的程序
break main
run
step
一步一步的走一定能搞明白的。
break main
run
step
一步一步的走一定能搞明白的。
|
看看先
|
你的意思是说数据队列里的数据没有被全部处理掉是吗?也就是说当执行“while(!emptyQueue(&q)){” outQueue里面还有元素没有被分配到线程池中去执行。 还是另外一个意思:线程池中的线程执行到一半就因主程序的shutdown=1而终止掉了。 本想帮你去调试一下,没时间了。明天再来看看
|
问题应该是这样的:
while(!emptyQueue(&q)){
i ++;
ptr = outQueue(&q);
pool_add_worker(myprocess,(void *)ptr);
} //这个循环太快了,当你刚刚将全部工作投入到线程中时,主程序已经执行到了pool_destroy了,它将shutdown设1,而多数子线程才刚刚开始执行,自然会判断shutdown然后退出咯。 后面那个sleep语句是要的,不过没必要那么长,它可以让线程执行到shutdown的判断后面,而主程序此时还没有将shutdown设1
printf("%dnnn",i);
/*等待所有任务完成*/
// sleep (100);
/*销毁线程池*/
pool_destroy ();
while(!emptyQueue(&q)){
i ++;
ptr = outQueue(&q);
pool_add_worker(myprocess,(void *)ptr);
} //这个循环太快了,当你刚刚将全部工作投入到线程中时,主程序已经执行到了pool_destroy了,它将shutdown设1,而多数子线程才刚刚开始执行,自然会判断shutdown然后退出咯。 后面那个sleep语句是要的,不过没必要那么长,它可以让线程执行到shutdown的判断后面,而主程序此时还没有将shutdown设1
printf("%dnnn",i);
/*等待所有任务完成*/
// sleep (100);
/*销毁线程池*/
pool_destroy ();
|
兄弟,楼上说你申请的内存都没有释放...
|
想了一下,两三秒也是不行。
那就用只有用信号量同步了,主程序在destroy等待信号量,在读取队列最后一个元素完了之后释放信号量,这样应该是可以的
那就用只有用信号量同步了,主程序在destroy等待信号量,在读取队列最后一个元素完了之后释放信号量,这样应该是可以的