在以下代码c
中将继续打印“。”,
execute_on_thread()
函数等待使用main
从execute_on_thread
发出信号的条件。但是,它在指定的20秒超时后没有超时,它只是继续打印“。”,没有其他事情发生。
pthread_cond_timedwait
答案 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
处理取消请求,请确保互斥锁已解锁。