0

私はこれを持っています

#threads 
import thread
import threading
import time

class ThreadTask(threading.Thread):
    def __init__(self,name,delay,callback):

        threading.Thread.__init__(self)

        self.name = name
        self.counter = 0
        self.delay = delay
        self.callback = callback
        self.lock = threading.Lock()

    def run(self):
        while True:
            self.counter += 1
            print 'running ', self.name , self.counter
            time.sleep(self.delay)

            if self.counter % 5 == 0:
                self.callback(self)


class Barrier(object):
    def __init__(self):
        self.locks = []

    def wait_task(self,task):
        print 'lock acquire'
        self.locks.append(task.lock)
        task.lock.acquire(True)
        task.lock.acquire(True)


    def notity_task(self,task):
        print 'release lock'
        for i in self.locks: 
            try:
                i.release()
            except Exception, e:
                print 'Error', e.message

            print 'Lock released'

       self.locks = []


try:
    barrier = Barrier()

    task1 = ThreadTask('Task_1',1,barrier.wait_task)
    task4 = ThreadTask('Task_4',1,barrier.wait_task)
    task3 = ThreadTask('Task_3',2,barrier.wait_task)
    task2 = ThreadTask('Task_2',3,barrier.notity_task)

    task2.start()
    task1.start()
    task3.start()
    task4.start()

except Exception as e:
    raise e

while 1:
    pass

これらのスレッドは正常に実行されますが、2 つの task.lock.acquire(True) を連続して配置すると、それ以外の場合は機能しません。各 5 にする必要があるときに各 10 を停止します。何が起こっているのか知っている人はいますか?

ありがとう

4

1 に答える 1

0

ここでは、再入不可の通常のロックを作成します。

    self.lock = threading.Lock()

そしてここで2回取得してみる

    task.lock.acquire(True)
    task.lock.acquire(True)

これは違法です。同じスレッドで通常のロックを 2 回取得することはできません。

おそらく、あなたはthreading.RLock()?を使用することを意味します。

于 2014-03-27T08:34:58.993 に答える