J'essaie de comprendre les bases du threading et de la concurrence. Je veux un cas simple où deux threads essaient de manière répétée d'accéder à une ressource partagée.
Le code :
import threading
class Thread(threading.Thread):
def __init__(self, t, *args):
threading.Thread.__init__(self, target=t, args=args)
self.start()
count = 0
lock = threading.Lock()
def increment():
global count
lock.acquire()
try:
count += 1
finally:
lock.release()
def bye():
while True:
increment()
def hello_there():
while True:
increment()
def main():
hello = Thread(hello_there)
goodbye = Thread(bye)
while True:
print count
if __name__ == '__main__':
main()
J'ai donc deux threads, qui essaient tous deux d'incrémenter le compteur. Je pensais que si le thread 'A' appelait increment()
le lock
serait établi, empêchant "B" d'accéder jusqu'à ce que "A" soit libéré.
Running the montre clairement que ce n'est pas le cas. Vous obtenez tous les incréments aléatoires de la course aux données.
Comment l'objet de verrouillage est-il utilisé exactement ?
De plus, j'ai essayé de placer les verrous à l'intérieur des fonctions du fil, mais toujours pas de chance.