【问题标题】:Multithreading - Alternate between two threads using locks多线程 - 使用锁在两个线程之间交替
【发布时间】:2013-11-12 20:51:44
【问题描述】:

我正在尝试编写一个程序,我希望使用它在两个线程之间交替,线程1 和线程2。棘手的部分是我要确保应该开始执行的第一个线程是 thread1。这是我到目前为止的代码,但它不断向我抛出运行时异常。

lock1.release() 错误: 释放解锁的锁

但是,在我看来,lock1 并不是正在释放的未锁定锁!

这是我目前的代码

class Client: 
    #member variables
   def sendFile(self,lock1,lock2):
        sent = 0
        while (i<self.size):

            if(sent!=0):
                lock2.acquire()
            BadNet.transmit(self.clientSocket,message,self.serverIP,self.serverPort)
            lock1.release()
            sent+=1

        self.clientSocket.close()

    def receiveAck(self,lock1,lock2):
        print "\n Entered ack !"
        lock1.acquire()
        ack, serverAddress = self.clientSocket.recvfrom(self.buf)
        lock2.release()



if __name__ == "__main__":
    lock1 = Lock()
    lock2 = Lock()
    client = Client();
    client.readFile();
    thread1 = Thread(target = client.sendFile, args=[lock1,lock2])
    thread2 = Thread(target = client.receiveAck, args=[lock1,lock2])
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

【问题讨论】:

  • 我添加if条件if(sent!=0):的原因是为了确保首先开始执行的是thread1。
  • 您似乎想使用Conditions,而不是Locks

标签: python multithreading


【解决方案1】:

您收到错误是因为您有一个线程试图释放它没有获得的锁。锁是特定于线程的。也就是说,如果 thread1 获得了一个锁,那么 thread1 必须释放它。如果thread1获得了一个锁,而thread2试图释放它,那么thread2就会报错。

如果一个线程没有获得锁,那么该线程就不能释放锁。

您正在尝试将锁用于它们不适合的东西。锁用于互斥,而不是消息传递。如果您想通知线程发生了什么事,请使用event objectcondition object

【讨论】:

  • 非常感谢您的回答。我认为 python 中的锁的工作方式与 POSIX 中的互斥锁的工作方式相同,因此会造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多