diff -r 8fe59931b64d Lib/concurrent/futures/_base.py --- a/Lib/concurrent/futures/_base.py Thu Jan 23 11:25:48 2014 +0100 +++ b/Lib/concurrent/futures/_base.py Thu Jan 23 14:28:52 2014 +0100 @@ -155,8 +155,10 @@ def _create_and_install_waiters(fs, retu elif return_when == FIRST_COMPLETED: waiter = _FirstCompletedWaiter() else: - pending_count = sum( - f._state not in [CANCELLED_AND_NOTIFIED, FINISHED] for f in fs) + with _AcquireFutures(fs): + pending_count = sum( + f._state not in [CANCELLED_AND_NOTIFIED, FINISHED] + for f in fs) if return_when == FIRST_EXCEPTION: waiter = _AllCompletedWaiter(pending_count, stop_on_exception=True) @@ -165,8 +167,9 @@ def _create_and_install_waiters(fs, retu else: raise ValueError("Invalid return condition: %r" % return_when) - for f in fs: - f._waiters.append(waiter) + with _AcquireFutures(fs): + for f in fs: + f._waiters.append(waiter) return waiter @@ -222,8 +225,9 @@ def as_completed(fs, timeout=None): pending.remove(future) finally: - for f in fs: - f._waiters.remove(waiter) + with _AcquireFutures(fs): + for f in fs: + f._waiters.remove(waiter) DoneAndNotDoneFutures = collections.namedtuple( 'DoneAndNotDoneFutures', 'done not_done') @@ -269,8 +273,9 @@ def wait(fs, timeout=None, return_when=A waiter = _create_and_install_waiters(fs, return_when) waiter.event.wait(timeout) - for f in fs: - f._waiters.remove(waiter) + with _AcquireFutures(fs): + for f in fs: + f._waiters.remove(waiter) done.update(waiter.finished_futures) return DoneAndNotDoneFutures(done, set(fs) - done)