Reader-Writer锁无法正常工作

时间:2015-05-06 11:13:52

标签: python multithreading locking writer reader

我做了一个读写器(有编写者偏见,例如写入时没有读取)锁定在Python中由于其中一个写入者没有释放锁定而无法正常工作,即使它打印了消息并且是本来应该释放锁。

这是我的代码:

from threading import Thread
from threading import Lock
import time
import datetime

resource = 'hello world'
lock = Lock()
counter = 0
Lcounter = 0

class WriterA(Thread):
    def run(self):
        while True:
            global lock
            global resource
            global counter
            global Lcounter
            time.sleep(5)
            if Lcounter == 1:
                if counter == -1:
                    print ("WriterA is trying to acquire the lock")
                    lock.acquire()

                    print ("WriterA acquired the lock")
                    time.sleep(5)
                    now = datetime.datetime.now()
                    temp = "%d/%m/%Y %H:%M:%S"
                    now_string = now.strftime(temp)
                    resource = now_string

                    print ("WriterA releasing the lock")
                    lock.release()
                    counter = 0

class WriterB(Thread):
    def run(self):
        while True:
            global lock
            global resource
            global counter
            global Lcounter
            time.sleep(5)
            if Lcounter == 2:
                if counter == -1:
                    print ("WriterB is trying to acquire the lock")
                    lock.acquire()

                    print ("WriterB acquired the lock")
                    time.sleep(5)
                    print resource
                    resource = (resource [::-1])

                    print ("WriterB is releasing the lock")
                    lock.release()
                    counter = 0

class Reader(Thread):
    def run(self):
        global resource
        global counter
        global Lcounter
        if counter >= 0:
            time.sleep(5)
            print ("Reader is trying to acquire the resource")

            print ("Reader acquired the resource")
            time.sleep(5)
            temp = resource
            print ("The message in %s is %s " % (self.name, temp))
            Lcounter += 1
            counter = -1

Reader().start()
time.sleep(5)
WriterA().start()
time.sleep(5)
Reader().start()
time.sleep(5)
WriterB().start()
time.sleep(5)
Reader().start()

输出:

Reader is trying to acquire the resource
Reader acquired the resource
The message in Thread-6 is hello world 
WriterA is trying to acquire the lock
WriterA acquired the lock
WriterA releasing the lock
Reader is trying to acquire the resource
Reader acquired the resource
The message in Thread-10 is 06/05/2015 14:55:14 
WriterB is trying to acquire the lock
WriterB acquired the lock
06/05/2015 14:55:14
WriterB is releasing the lock

这是我使用@User hanging_threads获得的输出:

Reader is trying to acquire the resource
Reader acquired the resource
The message in Thread-7 is hello world 
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd.py", line 227, in OnRun
    self._py_db_command_thread_event.wait(0.5)
  File "C:\Python27\lib\threading.py", line 621, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
WriterA is trying to acquire the lock
WriterA acquired the lock
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 400, in OnRun
    cmd = self.cmdQueue.get(1, 0.1)
  File "C:\Python27\lib\Queue.py", line 177, in get
    self.not_empty.wait(remaining)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
WriterA releasing the lock
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd.py", line 227, in OnRun
    self._py_db_command_thread_event.wait(0.5)
  File "C:\Python27\lib\threading.py", line 621, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
Reader is trying to acquire the resource
Reader acquired the resource
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 44, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 400, in OnRun
    cmd = self.cmdQueue.get(1, 0.1)
  File "C:\Python27\lib\Queue.py", line 177, in get
    self.not_empty.wait(remaining)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
The message in Thread-11 is 06/05/2015 15:18:58 
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 1107, in _exitfunc
    t.join()
  File "C:\Python27\lib\threading.py", line 949, in join
    self.__block.wait()
  File "C:\Python27\lib\threading.py", line 340, in wait
    waiter.acquire()
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 20, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
WriterB is trying to acquire the lock
WriterB acquired the lock
06/05/2015 15:18:58
WriterB is releasing the lock
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 1107, in _exitfunc
    t.join()
  File "C:\Python27\lib\threading.py", line 949, in join
    self.__block.wait()
  File "C:\Python27\lib\threading.py", line 340, in wait
    waiter.acquire()
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 20, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd.py", line 227, in OnRun
    self._py_db_command_thread_event.wait(0.5)
  File "C:\Python27\lib\threading.py", line 621, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 400, in OnRun
    cmd = self.cmdQueue.get(1, 0.1)
  File "C:\Python27\lib\Queue.py", line 177, in get
    self.not_empty.wait(remaining)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 44, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 1107, in _exitfunc
    t.join()
  File "C:\Python27\lib\threading.py", line 949, in join
    self.__block.wait()
  File "C:\Python27\lib\threading.py", line 340, in wait
    waiter.acquire()
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 20, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd.py", line 227, in OnRun
    self._py_db_command_thread_event.wait(0.5)
  File "C:\Python27\lib\threading.py", line 621, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 44, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 1107, in _exitfunc
    t.join()
  File "C:\Python27\lib\threading.py", line 949, in join
    self.__block.wait()
  File "C:\Python27\lib\threading.py", line 340, in wait
    waiter.acquire()
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 20, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd.py", line 227, in OnRun
    self._py_db_command_thread_event.wait(0.5)
  File "C:\Python27\lib\threading.py", line 621, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 44, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 1107, in _exitfunc
    t.join()
  File "C:\Python27\lib\threading.py", line 949, in join
    self.__block.wait()
  File "C:\Python27\lib\threading.py", line 340, in wait
    waiter.acquire()
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:/Users/Abdulkadir/PycharmProjects/labb5/labb5_final.py", line 20, in run
    time.sleep(5)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 325, in OnRun
    r = self.sock.recv(1024)
--------------------    Thread 11612    --------------------
  File "C:\Python27\lib\threading.py", line 783, in __bootstrap
    self.__bootstrap_inner()
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd_comm.py", line 267, in run
    self.OnRun()
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.6\helpers\pydev\pydevd.py", line 227, in OnRun
    self._py_db_command_thread_event.wait(0.5)
  File "C:\Python27\lib\threading.py", line 621, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 359, in wait
    _sleep(delay)

0 个答案:

没有答案