0

ライターの 1 つがロックを解放せず、メッセージを出力し、解放することになっているにもかかわらず、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 hang_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)
4

0 に答える 0