pthread_cond_timedwait ret 22但是errno是成功的

时间:2017-11-20 14:35:40

标签: linux pthreads

我正在调用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为零?

1 个答案:

答案 0 :(得分:2)

  

任何人都可以帮助我理解为什么pthread_cond_timedwait返回22但是errno为零?

Pthreads函数可能设置也可能不设置errno值;它们的返回值表示错误值。您可以将ret分配给errno并致电perror()strerror()

  

然而,经过一段时间后,我的价值已经达到22,但是错误是成功的。

您说pthread_cond_timedwait()值的返回值为22(通常为EINVAL),表示问题在于您传递的timeout.tv_nsec值。

POSIX manual说:

  

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;