我正在尝试编写一个程序,我希望在两个线程(thread1和thread2)之间交替使用。棘手的部分是我要确保应该开始执行的第一个线程是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()
答案 0 :(得分:3)
您收到错误是因为您有一个线程试图释放它没有获取的锁。锁是特定于线程的。也就是说,如果thread1获取了一个锁,那么thread1必须释放它。如果thread1获取了一个锁并且thread2试图释放它,那么thread2将会出错。
如果一个线程没有获得锁,那么该线程就无法释放锁。
你正试图将锁用于他们不想要的东西。锁用于互斥,而不是消息传递。如果您想通知某个帖子发生了某些事情,请使用event object或condition object。