Richard Oudkerk <shibt...@gmail.com> added the comment:

Standard condition variables have the following guarantees:

* if there are any waiters then signal()/notify() will awaken at least one of 
them;
* if there are any waiters then broadcast()/notify_all() will awaken all of 
them.

The implementation in condvar.h does not have these guarantees since a future 
waiter (possibly the signalling thread) may steal the signal intended for a 
current waiter.

In many cases this does not matter, but in some it can cause a deadlock.  For 
instance, consider

    from threading import Condition, Thread
    import time

    def set_to_value(value, cond, state):
        while 1:
            with cond:
                while state.value == value:
                   cond.wait()
                state.value = value
                print("set_to_value(%s)" % value)
                cond.notify_all()

    class state:
        value = False

    c = Condition()

    for i in (0, 1):
        t = Thread(target=set_to_value, args=(i, c, state))
        t.daemon = True
        t.start()

    time.sleep(5)

This *should* make state.value bounce back and forth between 0 and 1 
continually for five seconds.

But using a condition variable implemented like in condvar.h this program is 
liable to deadlock because the signalling thread steals the signal intended for 
the other thread.

I think a note about this should be added to condvar.h.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue15038>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to