获得锁后检查 multiprocessing.Value 的值

Checking a multiprocessing.Value's value after getting the lock

这是一个代码片段:

from multiprocessing import Value
import os

v = Value('i', 0)

# The following code runs in multiple processes
if v.value == 0:
    with v.get_lock():
        if v.value == 0: # Is this line necessary?
            v.value = os.getpid()

由于os.getpid()不同,是否需要在拿到锁后再次检查?

我可以想象得到锁后没有额外检查的以下流程:

该值将是 P2 设置的值,即使 P1 获得了锁并首先更改了它。

我所做的假设有误吗?在获得锁后添加额外检查是否在每种情况下都能解决问题?如果是这样,它被认为是一种好的做法吗?

我没有在多处理中使用共享内存对象,但是 if v.value == 0with v.get_lock() 之间绝对有一个 race condition

所以是的,您需要再次测试。

也许更重要的是 - as it says in the docs,您(或稍后阅读本文的人)可能不想共享内存,除非这是经过深思熟虑的决定。现在你有进程相互等待,这可能会破坏多处理的主要好处。