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

>  conn = MySQLConn()
>  start_thread1(conn)
>  start_thread2(conn):
>  while True:
>    if os.fork() == 0:  # child
>      raise Exception('doom')  # triggers destructor

There is no guarantee here that the lock will be held at the time of the fork.  
So even if we ensure that a lock acquired before the fork stayed lock, we won't 
necessarily get a deadlock.

More importantly, you should never fork without ensuring that you exit with 
os._exit() or os.exec*().  So your example should be something like

  conn = MySQLConn()
  start_thread1(conn)
  start_thread2(conn):
  while True:
    if os.fork() == 0:  # child
      try:
        raise Exception('doom')  # does NOT trigger destructor
      except:
        sys.excepthook(*sys.exc_info())
        os._exit(1)
      else:
        os._exit(0)

With this hard exit the destructor never runs.

----------

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

Reply via email to