pthread清理函数没有被调用

时间:2016-03-14 09:26:26

标签: c pthreads

我正在尝试使用pthread清理函数来释放被取消的线程所持有的互斥锁

#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#define SHOW_TECH_CMD_MAX_EXEC_TIME       5 //in secs 
pthread_mutex_t waitMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t testMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t waitCond = PTHREAD_COND_INITIALIZER;
void mutex_cleanup_handler(void *arg )
{
   printf("cleanup \n");
   pthread_mutex_unlock( &testMutex );
}
void *execute_on_thread(void *arg);
void *execute_on_thread(void *arg)
{
  pthread_cleanup_push(mutex_cleanup_handler, NULL);
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
  pthread_mutex_lock( &testMutex );
  while(1)
  {
    printf(".");
  }
  pthread_mutex_lock( &waitMutex );
  pthread_cond_signal( &waitCond );
  pthread_mutex_unlock( &waitMutex );
  pthread_cleanup_pop(1); // even with 1 behavior remains the same
  return (void *) 0;

}
int main( )
{
  pthread_t tid;
  struct timespec   ts;
  int error;
  clock_gettime(CLOCK_REALTIME, &ts);
  ts.tv_sec += 5; 
  pthread_create(&tid,NULL,execute_on_thread,NULL);
  pthread_mutex_lock(&waitMutex);
  error = pthread_cond_timedwait(&waitCond, &waitMutex,&ts);
  pthread_mutex_unlock(&waitMutex);
  printf("come here 1\n");
  if(error == ETIMEDOUT)
  {
    printf("come here 2\n");
    error = pthread_cancel(tid);
    if(error != 0)
    {
       printf("come here 3\n");
    }
      }
}

清理功能本身没有被调用 线程正在被正确清除,但是没有调用清理函数

1 个答案:

答案 0 :(得分:2)

正如Man所说:

  

pthread_cleanup_pop()函数删除顶部的例程          清理处理程序堆栈,,如果执行,可以选择执行它          非零。

然后你必须写:

pthread_cleanup_pop(1);

请注意您的线程函数定义不正确

修改

使用您的代码,下面的更正有效。

  if(error == ETIMEDOUT)
  {
    printf("come here 2\n");
    error = pthread_cancel(tid);
    pthread_join(tid, NULL);
    if(error != 0)
    {
       printf("come here 3\n");
    }

您必须在应用程序结束前等待线程完成。 在您的代码中,在线程取消请求之后,应用程序立即结束。