MST

星途 面试题库

面试题:Python列表元素动态更新在多线程环境下的处理

在多线程环境中,有一个共享的列表 `shared_list`,多个线程会同时对列表中的元素进行动态更新(例如:将元素值加1)。请设计一个Python程序,使用合适的同步机制确保数据的一致性和线程安全,并解释同步机制的原理和选择原因。
17.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import threading

shared_list = [0] * 10
lock = threading.Lock()


def update_list(index):
    global shared_list
    with lock:
        shared_list[index] += 1


threads = []
for i in range(len(shared_list)):
    t = threading.Thread(target=update_list, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(shared_list)

同步机制原理

这里使用了 threading.Lock 作为同步机制。Lock(锁)是一种基本的同步原语。当一个线程获取到锁(通过 lock.acquire() 方法,with lock 语句块内部会自动调用 acquire 方法),其他线程就无法获取该锁,直到该线程释放锁(通过 lock.release() 方法,with lock 语句块结束时会自动调用 release 方法)。这就保证了在同一时刻只有一个线程能够访问并修改共享资源 shared_list,从而避免了数据竞争和不一致的问题。

选择原因

  1. 简单易用threading.Lock 提供了一种非常直观和简单的方式来同步线程对共享资源的访问。使用 with 语句可以确保锁在代码块执行完毕后自动释放,减少了手动管理锁的复杂性和出错的可能性。
  2. 通用性:对于这种简单的共享资源更新场景,普通的锁机制足以满足需求。不需要引入更复杂的同步原语如信号量(Semaphore)或条件变量(Condition)等,降低了程序的复杂度。
  3. 效率:在这种单个共享资源且操作相对简单的情况下,Lock 的开销相对较小,能够有效提高多线程环境下的执行效率。