我正在调用pthread_cond_timedwait
,我将其置于超时值
clock_gettime(CLOCK_MONOTONIC, &timeout);
//timeout.tv_sec+= 1;
timeout.tv_nsec+= 100000000;
ret = pthread_cond_timedwait(&Cond, &Mtx, &timeout);
然而,经过一段时间后,我的价值已经达到22,但是错误是成功的。
如果我启用timeout.tv_sec
并注释掉timeout.tv_nsec
,那么我没有看到任何问题,而且我总是得到零值,但反之亦然。
任何人都可以帮助我理解为什么pthread_cond_timedwait
会返回22但是errno
为零?
答案 0 :(得分:2)
任何人都可以帮助我理解为什么pthread_cond_timedwait返回22但是errno为零?
Pthreads函数可能设置也可能不设置errno
值;它们的返回值表示错误值。您可以将ret
分配给errno
并致电perror()
或strerror()
。
然而,经过一段时间后,我的价值已经达到22,但是错误是成功的。
您说pthread_cond_timedwait()
值的返回值为22(通常为EINVAL
),表示问题在于您传递的timeout.tv_nsec
值。
EINVAL
abstime参数指定的纳秒值小于零或大于或等于1000万。
既然你这样做:
timeout.tv_nsec+= 100000000;
timedout.tv_nsec
可能已包含某些值,并且会在EINVAL
中添加1亿。如果上面的代码在一个函数中并且被重复调用,那么在第10次调用时,timeout.tv_nsec
将达到1000万。我建议您确保timeout.tv_nsec
少于10亿,然后重试。
例如,执行:
timeout.tv_nsec = 100000000;
而不是:
timeout.tv_nsec += 100000000;