MST

星途 面试题库

面试题:Python thread模块中的线程同步问题

在使用Python的thread模块时,可能会遇到线程同步问题,比如多个线程同时访问共享资源导致数据不一致。请详细阐述如何使用thread模块中的锁机制来解决这一问题,并给出一个具体的代码示例,示例中至少包含两个线程对共享资源进行读写操作。
41.3万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 锁机制原理

在Python的thread模块(在Python 3中建议使用_threadthread模块已被弃用)中,锁(Lock)是一种同步原语。当一个线程获取到锁时,其他线程必须等待该线程释放锁后才能获取锁并访问共享资源,从而避免多个线程同时访问共享资源导致的数据不一致问题。

2. 代码示例

import _thread
import time

# 共享资源
shared_resource = 0
# 创建锁对象
lock = _thread.allocate_lock()


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


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


try:
    # 启动第一个线程
    _thread.start_new_thread(increment, ())
    # 启动第二个线程
    _thread.start_new_thread(decrement, ())
except:
    print("Error: unable to start thread")

# 等待一段时间,确保线程执行完毕
time.sleep(2)
print("Final value of shared resource:", shared_resource)

在上述代码中:

  • lock = _thread.allocate_lock() 创建了一个锁对象。
  • incrementdecrement函数中,通过lock.acquire()获取锁,确保只有一个线程可以进入临界区(对共享资源进行操作的代码段)。
  • 使用try - finally语句块,在try块中对共享资源进行操作,在finally块中使用lock.release()释放锁,以保证无论操作是否出现异常,锁都会被释放。
  • 最后启动两个线程分别执行incrementdecrement函数,并等待一段时间确保线程执行完毕后输出共享资源的最终值。