当前位置:  技术问答>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 
一步一步的走一定能搞明白的。

|
看看先

|
你的意思是说数据队列里的数据没有被全部处理掉是吗?也就是说当执行“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 ();

|
兄弟,楼上说你申请的内存都没有释放...

|
想了一下,两三秒也是不行。
那就用只有用信号量同步了,主程序在destroy等待信号量,在读取队列最后一个元素完了之后释放信号量,这样应该是可以的

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教菜鸟问题 libpcap达人路过看看
  • 向linux达人请教linux下5.1声道测试工具
  • 请教下linux达人 相关版本2.6的进程调度
  • 请达人赐教Solaris10怎么修改子网掩码?
  • 急救!关于Shell脚本删除过期文件的问题,Shell脚本达人乱入
  • 求救达人,基于linux的开发
  • 寻 懂的redhat linux 下 . 使用automake和autoconf 自动生成Makefile 的 达人。
  • 内核学习,请达人指导
  • tcp连接的问题,达人请进
  • 有没有达人知道phear和 phishing这两个词汇的?
  • 那位达人装过zhcon?
  • 请达人介绍一些经典的linux下c编程的书籍
  • unix 环境下,我想写一个脚本用来建立informix 数据库的索引,请达人指教
  • 达人狂入:linux中木马,文件无法删除
  • 求助于达人
  • unix tomcat 达人请进来
  • 请教linux达人
  • 达人请进
  • 达人能否推荐一下硬件故障模拟工具
  • 内核启动中断问题,急求达人指点


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3