📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 10(1)

📅  最后修改于: 2023-12-03 15:12:45.257000             🧑  作者: Mango

题目介绍:门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|问题 10

这是一道关于多线程和锁同步的面试题目,题目要求实现一个门(Door)类,里面包含一个属性 door_status,两个方法 open() 和 close(),一个初始化方法 init()。

具体要求如下:

  • 门有两个状态:打开和关闭,门的默认状态是关闭。
  • open() 方法可以将门的状态变为打开状态
  • close() 方法可以将门的状态变为关闭状态
  • 门只允许单向流通,即同时只允许一边开门,当门的状态为打开时,此时不能再次开门;当门的状态为关闭时,此时不能再次关门。
  • 使用 Python 实现多线程同步,确保:同一时间只有一个线程可以操作门的状态。
  • 对于同步的实现,使用 lock 和 condition 都可以。

下面是门类的简要示意图:

    +-------+
    | 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 方法挂起,直到其他线程改变门的状态。

  • 如果门的状态是关闭,将其变为打开状态,并且输出 '门已打开'。
  • 如果门的状态是打开,将其变为关闭状态,并且输出 '门已关闭'。

最后,在每个方法里,我们通知其他线程门的状态已更新,确保其他线程可以获得锁并操作门的状态。

上面就是完整的答案解析,希望对你有所帮助。