MST

星途 面试题库

面试题:Python Thread类中的锁机制应用

在使用Python threading模块的Thread类创建多线程程序时,常常会遇到资源竞争问题。请详细阐述如何使用锁(Lock)机制来解决这个问题,并以一个共享变量的读写操作为例编写代码展示其应用,同时解释死锁产生的原因以及如何避免死锁。
47.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

锁(Lock)机制解决资源竞争问题

在多线程编程中,当多个线程同时访问和修改共享资源时,会导致数据不一致等资源竞争问题。锁机制通过确保在同一时间只有一个线程可以访问共享资源,来解决这个问题。

共享变量读写操作示例代码

import threading

# 共享变量
shared_variable = 0
# 创建锁对象
lock = threading.Lock()


def increment():
    global shared_variable
    for _ in range(100000):
        # 获取锁
        lock.acquire()
        try:
            shared_variable += 1
        finally:
            # 释放锁
            lock.release()


def decrement():
    global shared_variable
    for _ in range(100000):
        lock.acquire()
        try:
            shared_variable -= 1
        finally:
            lock.release()


if __name__ == "__main__":
    t1 = threading.Thread(target=increment)
    t2 = threading.Thread(target=decrement)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

    print(f"最终共享变量的值: {shared_variable}")

死锁产生的原因

死锁是指两个或多个线程相互等待对方释放锁,从而导致所有线程都无法继续执行的情况。通常发生在以下场景:

  1. 资源竞争:多个线程竞争多个资源,并且获取资源的顺序不一致。
  2. 循环依赖:线程A持有资源R1并等待资源R2,而线程B持有资源R2并等待资源R1,形成循环等待。

避免死锁的方法

  1. 按顺序获取锁:所有线程按照相同的顺序获取锁,避免循环依赖。
  2. 使用超时:在获取锁时设置超时时间,如果在规定时间内无法获取锁,则放弃并进行其他操作。
  3. 资源分配图算法:使用如银行家算法等资源分配算法,提前检测是否会发生死锁。
  4. 减少锁的持有时间:尽量缩短线程持有锁的时间,降低死锁发生的可能性。