threading多线程资源加锁

threading多线程资源加锁控制

# 线程.
import threading


def incr(n):
    global a
    for i in range(n):
        try:
            lock.acquire()  # 加锁相当于单线程了, 所以加锁的位置应该少;(py自带GIL锁).
            a += 1
        finally:
            lock.release()


def decr(n):
    global a
    for i in range(n):
        try:
            lock.acquire()
            a -= 1
        finally:
            lock.release()


if __name__ == "__main__":
    lock = threading.Lock()  # create Lock obj.
    a = 0
    n = 1000000  # 不加Lock, 如果这里n的值过大, 那么计算出的来的a的值就不是0了.

    t1 = threading.Thread(target=incr, args=(n,))
    t2 = threading.Thread(target=decr, args=(n,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(a)  # 多线程使用共享资源可能出现异常.使用加锁来解决, Lock

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Python多线程和锁的示例代码: ```python import threading # 创建一个锁对象 lock = threading.Lock() # 共享资源 shared_resource = 0 # 线程函数 def increment(): global shared_resource # 获取锁 lock.acquire() try: # 修改共享资源 shared_resource += 1 print(f'Incremented: {shared_resource}') finally: # 释放锁 lock.release() # 创建多个线程并启动 threads = [] for _ in range(5): t = threading.Thread(target=increment) t.start() threads.append(t) # 等待所有线程完成 for t in threads: t.join() ``` 在上面的示例中,我们使用`threading.Lock()`创建了一个锁对象`lock`。在`increment()`函数中,我们首先使用`lock.acquire()`获取锁,然后修改共享资源`shared_resource`,最后使用`lock.release()`释放锁。 通过使用锁,我们确保了同一时刻只有一个线程可以访问和修改共享资源。这样可以防止多个线程同时对共享资源进行写操作而导致竞态条件和数据不一致的问题。 请注意,在使用锁时,需要遵循以下几点: - 在需要保护共享资源的代码块之前使用`lock.acquire()`获取锁。 - 在对共享资源的操作完成后,使用`lock.release()`释放锁。 - 为了避免死锁,应该仔细设计锁的获取和释放逻辑,确保在任何情况下都能正确释放锁。 当多个线程同时访问共享资源时,只有一个线程能够获取到锁,并进行操作。其他线程在获取锁之前会被阻塞,直到锁被释放。 请根据您的具体需求和环境,适当修改和调整上述示例代码。同时,还可以了解更多关于Python多线程和锁的相关知识,以便更好地应用于实际场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值