【问题标题】:What is the return value of spurious wake-ups?虚假唤醒的返回值是多少?
【发布时间】:2020-04-21 04:37:27
【问题描述】:

在C11中,cnd_timedwait函数定义如下:

int cnd_timedwait( cnd_t* restrict cond, mtx_t* restrict mutex,
                   const struct timespec* restrict time_point );

自动解锁 mutex 指向的 mutex 并阻塞 cond 指向的条件变量,直到线程由 cnd_signalcnd_broadcast 发出信号,或直到 time_point 指向的基于 TIME_UTC 的时间点已被达到,或直到发生虚假唤醒。在函数返回之前,互斥锁再次被锁定。

返回值

thrd_success如果成功,thrd_timedout如果在互斥锁被锁定之前已经达到超时时间,或者thrd_error如果发生错误。

发生虚假唤醒时,函数会返回thrd_success 还是thrd_error

尽管据我所知,虚假唤醒在技术上并不被视为错误。

【问题讨论】:

标签: c multithreading posix c11


【解决方案1】:

如果cnd_timedwait 可以判断唤醒是虚假的,它就不会这样做。它不会为了欺骗你而做虚假的唤醒。它们发生是因为条件的值可以在安排唤醒之后但在被唤醒的线程设法做任何事情之前发生变化。

由于cnd_timedwait 无法判断返回值是否虚假,因此它的返回值无法反映这一事实。这是正常的成功返回。您的首要任务是验证条件。

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多