高手请进,pthread_cleanup_push和pthread_cleanup_pop()不能成对时如何设置线程退出清理函数

heronism 2014-04-11 07:40:17
问题描述见代码注释,问题在19行,多谢
  
/* 加锁 */
pthread_cleanup_push(pthread_mutex_unlock, &g_RpcMutex);

pthread_mutex_lock(&g_RpcMutex);

while(g_stRpcRsponseBuf.ulRpcSignalState != OAMS_ADAPT_RPC_SIGNAL_ACTIVED)
{
// 等待rpc消息处理完毕
pthread_cond_wait(&g_RpcCond, &g_RpcMutex);
//printf("thread 1 condition applied\n");
}
......
if(因为某种条件需要退出)
{
/* 退出前需要释放锁,并删除清理函数*/
/* 解锁 */
pthread_mutex_unlock(&g_RpcMutex);
/*问题:在此处加的pop函数会导致编译不过,不加的话清理函数会多余,
这种情况该如何设置清除函数 */
pthread_cleanup_pop(0);
retrun;
}

/* 解锁 */
pthread_mutex_unlock(&g_RpcMutex);
/* 正常的退出点 */
pthread_cleanup_pop(0);


...全文
127 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxianbin 2014-04-14
  • 打赏
  • 举报
回复
引用 2 楼 heronism 的回复:
[quote=引用 1 楼 zhxianbin 的回复:] 什么错误?
  
    /*  加锁 */
    pthread_cleanup_push(pthread_mutex_unlock, &g_RpcMutex);

    pthread_mutex_lock(&g_RpcMutex);

    while(g_stRpcRsponseBuf.ulRpcSignalState != OAMS_ADAPT_RPC_SIGNAL_ACTIVED)
    {
        // 等待rpc消息处理完毕
        pthread_cond_wait(&g_RpcCond, &g_RpcMutex);
        //printf("thread 1 condition applied\n");
    }
......
   if(因为某种条件需要退出)
  {
      ....
  }

     /*  解锁 */
        pthread_mutex_unlock(&g_RpcMutex);        
      /* 正常的退出点 */
        pthread_cleanup_pop(0);
这样不行吗
这样在“因为某种条件需要退出”的点退出不进行unlock和pop行吗[/quote]if 中不要 return 就继续下面代码执行了
luoyunjin 2014-04-12
  • 打赏
  • 举报
回复
引用 2 楼 heronism 的回复:
[quote=引用 1 楼 zhxianbin 的回复:] 什么错误?
  
    /*  加锁 */
    pthread_cleanup_push(pthread_mutex_unlock, &g_RpcMutex);

    pthread_mutex_lock(&g_RpcMutex);

    while(g_stRpcRsponseBuf.ulRpcSignalState != OAMS_ADAPT_RPC_SIGNAL_ACTIVED)
    {
        // 等待rpc消息处理完毕
        pthread_cond_wait(&g_RpcCond, &g_RpcMutex);
        //printf("thread 1 condition applied\n");
    }
......
   if(因为某种条件需要退出)
  {
      ....
  }

     /*  解锁 */
        pthread_mutex_unlock(&g_RpcMutex);        
      /* 正常的退出点 */
        pthread_cleanup_pop(0);
这样不行吗
这样在“因为某种条件需要退出”的点退出不进行unlock和pop行吗[/quote] 不解锁直接退出会导致程序崩溃
heronism 2014-04-12
  • 打赏
  • 举报
回复
引用 1 楼 zhxianbin 的回复:
什么错误?
  
    /*  加锁 */
    pthread_cleanup_push(pthread_mutex_unlock, &g_RpcMutex);

    pthread_mutex_lock(&g_RpcMutex);

    while(g_stRpcRsponseBuf.ulRpcSignalState != OAMS_ADAPT_RPC_SIGNAL_ACTIVED)
    {
        // 等待rpc消息处理完毕
        pthread_cond_wait(&g_RpcCond, &g_RpcMutex);
        //printf("thread 1 condition applied\n");
    }
......
   if(因为某种条件需要退出)
  {
      ....
  }

     /*  解锁 */
        pthread_mutex_unlock(&g_RpcMutex);        
      /* 正常的退出点 */
        pthread_cleanup_pop(0);
这样不行吗
这样在“因为某种条件需要退出”的点退出不进行unlock和pop行吗
zhxianbin 2014-04-11
  • 打赏
  • 举报
回复
什么错误?
  
    /*  加锁 */
    pthread_cleanup_push(pthread_mutex_unlock, &g_RpcMutex);

    pthread_mutex_lock(&g_RpcMutex);

    while(g_stRpcRsponseBuf.ulRpcSignalState != OAMS_ADAPT_RPC_SIGNAL_ACTIVED)
    {
        // 等待rpc消息处理完毕
        pthread_cond_wait(&g_RpcCond, &g_RpcMutex);
        //printf("thread 1 condition applied\n");
    }
......
   if(因为某种条件需要退出)
  {
      ....
  }

     /*  解锁 */
        pthread_mutex_unlock(&g_RpcMutex);        
      /* 正常的退出点 */
        pthread_cleanup_pop(0);
这样不行吗

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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