【问题标题】:Does a thread own a mutex after pthread_cond_timedwait times out?pthread_cond_timedwait 超时后线程是否拥有互斥锁?
【发布时间】:2017-03-02 10:14:05
【问题描述】:

线程调用pthread_cond_timedwait,返回ETIMEDOUT后,线程是否拥有互斥锁?

我最初认为不,但似乎我们必须调用pthread_mutex_unlock,即使在pthread_cond_timedwait 返回ETIMEDOUT 之后。

documentation 说:

成功返回后,互斥体将被锁定并归调用线程所有。

因此,如果返回不成功(返回值!= 0),我认为互斥锁不属于自己。

但是,如果我们在ETIMEDOUT 之后不调用pthread_mutex_unlock,则互斥锁似乎处于损坏状态(即我无法让另一个线程获取它,它只会停止)。

文档也暗示了这一点,因为它们总是解锁互斥锁,而不管pthread_cond_timedwait 的返回值如何:

(void) pthread_mutex_lock(&t.mn);
                t.waiters++;
        clock_gettime(CLOCK_REALTIME, &ts);
        ts.tv_sec += 5;
        rc = 0;
        while (! mypredicate(&t) && rc == 0)
                rc = pthread_cond_timedwait(&t.cond, &t.mn, &ts);
        t.waiters--;
        if (rc == 0) setmystate(&t);
(void) pthread_mutex_unlock(&t.mn);

那么,线程总是在pthread_cond_timedwait 之后获取互斥锁吗?这实际上没有意义,因为调用必须阻塞超过指定时间才能再次获取互斥锁。

【问题讨论】:

    标签: multithreading pthreads posix condition-variable


    【解决方案1】:

    您正在查看较早的 POSIX 问题。 Issue 7 有这个澄清的文字:

    当发生此类超时时,pthread_cond_timedwait() 仍应释放并重新获取 mutex 引用的互斥锁,并且可能会同时消耗指向条件变量的条件信号。

    如果在这种情况下它没有重新获取互斥锁,则无论如何您都必须在调用代码中重新获取它,以便在超时后重新测试条件,因为您可能已经消耗了条件信号。只有当您等待的条件没有发生并且发生超时时,您才应将其视为超时情况。

    超时并不是为了防止互斥锁被保持太久,它是为了防止条件信号没有及时到达(通常,互斥锁应该只保持较短的、相对确定的时间段,而条件被等待for 可能会受到外部输入的影响)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 2013-01-31
      • 2010-12-29
      • 2010-11-03
      • 1970-01-01
      • 2023-03-19
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多