<p>你有两个虫子。第一个是所罗门·斯洛在回答中提到的。在整个读-修改-写操作期间,您不会持有锁。正如您所建议的,可以通过向上移动锁来解决此问题</p>
<p>但是您还有一个问题,没有锁保护<code>euro</code>。每个线程都锁定自身,允许每个线程获取自身的锁,并且仍然同时执行读-修改-写操作</p>
<p>要解决这个问题,需要有一个特定的锁来保护<code>euro</code>,并且对它的所有操作都必须在这个锁的保护下完成。为此,我向<code>Casino</code>添加了一个锁</p>
<p>以下是固定代码:</p>
<pre><code>import threading
import time
class Casino:
euro = 0
lock = threading.Lock();
class PlayingThread(threading.Thread):
def __init__(self, the_casino, playerno=1):
threading.Thread.__init__(self)
self.lock = threading.Lock()
self.playerno = playerno
self.the_casino = the_casino
def run(self):
time.sleep(2)
self.the_casino.lock.acquire()
tmp = self.the_casino.euro
time.sleep(1)
self.the_casino.euro = tmp + 1
self.the_casino.lock.release()
casino = Casino()
lt = []
for i in range(0, 5):
pt = PlayingThread(casino, i)
pt.start()
lt.append(pt)
for t in lt:
t.join()
print("We earned a lot of money! Sum=", casino.euro)
</code></pre>
<p>我想你可能遗漏了锁工作原理的一些基本知识。一个锁不知道它锁的是什么,除了两个线程同时持有同一个锁之外,它不会阻止任何事情。您希望确保没有线程可以在其他线程读取<code>euro</code>、递增读取值并向其回写之间读取<code>euro</code>。实现这一点的方法是确保可能以任何方式与<code>euro</code>交互的每个线程都持有一个特定的锁</p>
<p>当我们说某个特定的锁保护某个特定的数据段时,我们的意思是没有线程在不持有该特定锁的情况下尝试访问或修改该特定的数据段。显然,这需要仔细地构建规范,以符合这一要求</p>