]> granicus.if.org Git - python/commitdiff
Issue 16998: Clarify that += on a shared value is not atomic.
authorRichard Oudkerk <shibturn@gmail.com>
Sun, 17 Nov 2013 17:00:38 +0000 (17:00 +0000)
committerRichard Oudkerk <shibturn@gmail.com>
Sun, 17 Nov 2013 17:00:38 +0000 (17:00 +0000)
Doc/library/multiprocessing.rst

index b2ed5448236576887b1952c686e7e22829248bd8..3d1c20952a9e703809aaf63c474a5f3c4f17988b 100644 (file)
@@ -1006,12 +1006,24 @@ inherited by child processes.
    ctypes type or a one character typecode of the kind used by the :mod:`array`
    module.  *\*args* is passed on to the constructor for the type.
 
-   If *lock* is ``True`` (the default) then a new lock object is created to
-   synchronize access to the value.  If *lock* is a :class:`Lock` or
-   :class:`RLock` object then that will be used to synchronize access to the
-   value.  If *lock* is ``False`` then access to the returned object will not be
-   automatically protected by a lock, so it will not necessarily be
-   "process-safe".
+   If *lock* is ``True`` (the default) then a new recursive lock
+   object is created to synchronize access to the value.  If *lock* is
+   a :class:`Lock` or :class:`RLock` object then that will be used to
+   synchronize access to the value.  If *lock* is ``False`` then
+   access to the returned object will not be automatically protected
+   by a lock, so it will not necessarily be "process-safe".
+
+   Operations like ``+=`` which involve a read and write are not
+   atomic.  So if, for instance, you want to atomically increment a
+   shared value it is insufficient to just do ::
+
+       counter.value += 1
+
+   Assuming the associated lock is recursive (which it is by default)
+   you can instead do ::
+
+       with counter.get_lock():
+           counter.value += 1
 
    Note that *lock* is a keyword-only argument.