我看到在极少数情况下会pthread_cond_timedwait()
返回EINVAL
并导致我们的系统发生致命崩溃。我知道这意味着传入的参数之一必须无效,但是 mutex 或 cond 变量如何变得无效?
有没有办法在调用之前检查这些参数pthread_cond_timedwait()
以防止崩溃?
我看到在极少数情况下会pthread_cond_timedwait()
返回EINVAL
并导致我们的系统发生致命崩溃。我知道这意味着传入的参数之一必须无效,但是 mutex 或 cond 变量如何变得无效?
有没有办法在调用之前检查这些参数pthread_cond_timedwait()
以防止崩溃?
没有明确说明什么是无效的,但这里有一些我观察到的pthread_cond_timedwait
返回原因EINVAL
:
如果不手动模仿 pthread 正在执行的验证调用,那么我不知道在调用之前检查参数的方法pthread_cond_timewait()
。但是,pthread_cond_timewait()
返回EINVAL
不应导致致命崩溃,因为它是特定情况。考虑检查可能无法正确处理返回结果的应用程序代码的其他区域。例如,只要返回不是就假定成功的代码ETIMEDOUT
。
我想分享一下我在这个问题上的经验,时间值是'timespec',它的'tv_nsec'范围应该保持在[0, 999999999]内,因此如果你将nano值设置为超过1秒,一些linux可能会返回 EINVAL!
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds [0 .. 999999999] */
};
希望这能帮助你摆脱困境。