我遇到了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;
}
答案 0 :(得分:1)
是的,这有点奇怪,但事实就是如此。最坏的情况是,您可以使用goto
跳转到适当范围内的return
语句。但通常有更自然的方式来做到这一点。