📅  最后修改于: 2023-12-03 15:12:45.257000             🧑  作者: Mango
这是一道关于多线程和锁同步的面试题目,题目要求实现一个门(Door)类,里面包含一个属性 door_status,两个方法 open() 和 close(),一个初始化方法 init()。
具体要求如下:
下面是门类的简要示意图:
+-------+
| Door |
+-------+
| open()|
| close()|
+-------+
/_\
|
+----------+
| |
| Thread |
| |
+----------+
import threading
class Door:
def __init__(self):
self.door_status = False # 门的默认状态是关闭
self.lock = threading.Lock() # 创建一个线程锁
self.condition = threading.Condition() # 创建一个线程条件
def open(self):
with self.lock:
while self.door_status:
self.condition.wait()
# 如果门的状态是关闭,将其变为打开状态
self.door_status = True
print('门已打开')
# 通知其他线程门的状态已更新
self.condition.notify_all()
def close(self):
with self.lock:
while not self.door_status:
self.condition.wait()
# 如果门的状态是打开,将其变为关闭状态
self.door_status = False
print('门已关闭')
# 通知其他线程门的状态已更新
self.condition.notify_all()
本题主要考察对多线程同步的理解及实际应用。对于这道题,我们可以创建一个门类 Door,里面包含门的状态 door_status 和两个方法 open 和 close。在每个方法里,我们可以将其进行线程同步,确保同一时间只有一个线程可以操作门的状态。为了实现线程同步,我们可以使用线程锁和线程条件。
在 Door 类的初始化方法里,我们使用了线程锁和线程条件 Lock 和 Condition。在 open 和 close 两个方法里,我们使用了 with statement 来上锁和解锁,确保同一时间只有一个线程可以操作门的状态。在每个方法里,我们使用 while 循环来检查门的状态是否符合操作门的要求。如果当前线程不能操作门的状态,则调用条件的 wait 方法挂起,直到其他线程改变门的状态。
最后,在每个方法里,我们通知其他线程门的状态已更新,确保其他线程可以获得锁并操作门的状态。
上面就是完整的答案解析,希望对你有所帮助。