【问题标题】:What happen after notify and before release for conditional locking在通知之后和释放条件锁定之前会发生什么
【发布时间】:2014-10-24 17:39:38
【问题描述】:

我在这里看到以下代码: https://docs.python.org/2/library/threading.html#condition-objects

# Consume one item (thread 1)
cv.acquire()
while not an_item_is_available():
    cv.wait()
get_an_available_item()
cv.release()

# Produce one item (thread 2)
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()

我的问题是,当在线程 2 中调用 cv.notify() 时,线程 1 从 cv.wait() 中唤醒,但在线程 2 调用 cv.release() 之前,线程 1 没有获取锁(我说的对吗?)。 .我的问题是:在调用cv.notify() 和从线程2 调用cv.release() 之前线程1 的行为是什么?

更新:

我从https://stackoverflow.com/a/17337630/1497720 找到的,但它是用于 java 的:

这维护了两个数据结构——一个等待集和一个入口集。 等待线程被添加到等待集中并停放,而线程 尝试获取监视器被添加到条目集中,然后 停放。在通知时,从等待集中取出一个线程并将其添加到 入口集。当一个线程释放锁时,它会释放一个线程 条目集(如果有)。请注意,这些集合实际上是 以队列(链表)的形式实现,因此以 FIFO 为基础进行处理。

【问题讨论】:

    标签: python multithreading python-2.7 synchronization locking


    【解决方案1】:

    来自Condition.notify的文档:

    注意:一个被唤醒的线程实际上并没有从它的wait() 调用中返回,直到它可以重新获得锁。由于notify() 不释放锁,它的调用者应该。

    因此,在调用cv.notify() 之后但在调用cv.release() 之前的行为是线程1 仍然在cv.wait() 处被阻塞。

    【讨论】:

      【解决方案2】:

      notify() 和 notifyAll() 方法不会释放锁;这意味着被唤醒的线程不会立即从它们的 wait() 调用中返回,而只有在调用 notify() 或 notifyAll() 的线程最终放弃锁的所有权时才会返回。

      来源:https://docs.python.org/2.7/library/threading.html#condition-objects

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2020-08-09
        相关资源
        最近更新 更多