MST

星途 面试题库

面试题:Python多线程环境下安全修改字典值的实现

在一个多线程环境中,有多个线程可能同时尝试修改同一个字典的值,例如 `shared_dict = {'count': 0}`。请设计一个方案来安全地修改 `count` 的值,防止数据竞争,并使用Python代码实现。解释所用到的同步机制及其原理。
12.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

使用threading.Lock实现安全修改

import threading

shared_dict = {'count': 0}
lock = threading.Lock()


def increment():
    global shared_dict
    with lock:
        shared_dict['count'] += 1


threads = []
for _ in range(10):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(shared_dict['count'])

同步机制及其原理

  1. threading.Lock:这是Python threading模块提供的一种基本的同步原语。
    • 原理Lock有两种状态,锁定(locked)和未锁定(unlocked)。当一个线程获取到锁(调用lock.acquire())时,锁的状态变为锁定,其他线程在尝试获取锁时会被阻塞,直到该锁被释放(调用lock.release())。with lock:语句是一种更简洁的使用方式,它会自动在代码块开始时获取锁,在代码块结束时释放锁。这样可以确保在任何时刻,只有一个线程能够进入临界区(这里是修改shared_dict['count']的代码块),从而避免数据竞争。

在上述代码中,increment函数每次执行shared_dict['count'] += 1操作前,先获取锁,操作完成后释放锁,这样就保证了多个线程对shared_dict['count']的修改是安全的。