pthread_cancel()并使用清理处理程序。

时间:2016-08-05 19:58:01

标签: c pthreads pthread-cleanup

我遇到了pthread取消和使用清理处理程序的问题。 在POSIX库中有两个功能: pthread_cleanup_push pthread_cleanup_pop 。 问题是它们不是功能,而是宏! 此外,它们似乎必须成对放置,即每次推动时,必须也有弹出。但我觉得这有点奇怪。

假设我有这样的代码结构:

{
    pthread_mutex_lock(&mutex); 
    pthread_cleanup_push(cleanup_mutex, &mutex); 

    // any code that can be cancellation point 

    while(/*some condition *) { 
         // any code that cancellation point 

         // 1. signaled -> thread given mutex 
         // 2. timeout -> thread given mutex 
         // 3. canceled -> thread given mutex and than cleanup handlers 
         if(pthread_cond_timedwait(&cond, &mutex, &abstimeout) == ETIMEDOUT) { 

            /*** HERE SHOULD BE pthread_cleanup_pop(0)! But it cannot be placed! case 2)***/ 
            pthread_mutex_unlock(&mutex); 
            return NULL; 
           }
      }
      // any code that can be cancellation point 

      // consume something 

      // any code that can be cancellation point 

      pthread_cleanup_pop(0); // takes care of case 1)
      pthread_mutex_unlock(&mutex); 

      return something;   

    } 

1 个答案:

答案 0 :(得分:1)

是的,这有点奇怪,但事实就是如此。最坏的情况是,您可以使用goto跳转到适当范围内的return语句。但通常有更自然的方式来做到这一点。