pthread_cond_timedwait在指定的超时后没有返回

时间:2016-03-10 06:38:35

标签: pthreads

在以下代码c中将继续打印“。”, execute_on_thread()函数等待使用mainexecute_on_thread发出信号的条件。但是,它在指定的20秒超时后没有超时,它只是继续打印“。”,没有其他事情发生。

pthread_cond_timedwait

1 个答案:

答案 0 :(得分:0)

查看pthread_cond_wait的文档:

  

成功返回后,互斥锁应已锁定且应为   由调用线程拥有。

因此,在pthread_cond_wait返回之前,无论是由于信号到达还是超时,它都会尝试锁定互斥锁。但是 - 由于execute_on_thread永远不会释放互斥锁(由于while(1)循环),pthread_cond_wait将等待互斥锁等待解锁。

例如,如果您在每个周期中更改execute_on_thread以暂时解锁互斥锁,则应该可以使其正常工作。例如:

void *execute_on_thread()
{
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);   //Not necessary - this is the default state for new threads
  pthread_mutex_lock( &waitMutex );
  while(1)
  {
    printf(".\n");
    pthread_mutex_unlock(&waitMutex);
    usleep(100*1000);                 //So that the screen doesn't completely fill up with '.'s
    pthread_mutex_lock( &waitMutex );
  }
  pthread_cond_signal( &waitCond );
  pthread_mutex_unlock( &waitMutex );
  return (void *) 0;
}

但请注意,在您的程序中还有其他一些可以改进的东西 - 比如在条件等待中添加一个保护变量(看看condition variable - why calling pthread_cond_signal() before calling pthread_cond_wait() is a logical error?),添加一个清理处理程序来制作如果在互斥锁被锁定和类似调整时由execute_on_thread处理取消请求,请确保互斥锁已解锁。