MST

星途 面试题库

面试题:Python多变量赋值原子性在并发场景下的验证

假设你在多线程环境下,需要验证Python多变量赋值的原子性。请描述整体验证思路,并给出关键代码片段,说明如何处理线程同步和验证结果的判断。
28.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

验证思路

  1. 多变量赋值测试:在多个线程中对多个变量同时进行赋值操作。
  2. 线程同步:使用锁机制(如threading.Lock)来确保只有一个线程可以进行赋值操作,以此来对比有锁和无锁情况下的结果。
  3. 验证结果判断:通过检查变量赋值后的结果是否符合预期来判断多变量赋值是否具有原子性。如果在无锁情况下出现不符合预期的结果,说明多变量赋值不具有原子性。

关键代码片段

import threading

# 共享变量
a = 0
b = 0
lock = threading.Lock()


def assign_with_lock():
    global a, b
    with lock:
        a, b = 1, 2


def assign_without_lock():
    global a, b
    a, b = 1, 2


# 创建线程
threads_with_lock = [threading.Thread(target=assign_with_lock) for _ in range(10)]
threads_without_lock = [threading.Thread(target=assign_without_lock) for _ in range(10)]

# 启动有锁线程
for t in threads_with_lock:
    t.start()
for t in threads_with_lock:
    t.join()

# 检查有锁结果
if a == 1 and b == 2:
    print("有锁情况下,多变量赋值结果正确")
else:
    print("有锁情况下,多变量赋值结果错误")

# 启动无锁线程
for t in threads_without_lock:
    t.start()
for t in threads_without_lock:
    t.join()

# 检查无锁结果
if a == 1 and b == 2:
    print("无锁情况下,多变量赋值结果正确")
else:
    print("无锁情况下,多变量赋值结果错误")

线程同步处理

assign_with_lock函数中,使用with lock:语句来获取锁,确保在同一时间只有一个线程可以执行a, b = 1, 2这个赋值操作。

验证结果判断

分别在有锁和无锁的多线程执行完成后,检查ab的值是否为预期的12。如果值符合预期,说明多变量赋值在这种情况下表现正确;如果不符合,说明可能存在非原子性操作导致赋值结果异常。