前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十、python学习笔记-线程-线程同步锁

十、python学习笔记-线程-线程同步锁

原创
作者头像
堕落飞鸟
发布2022-02-01 20:34:53
3100
发布2022-02-01 20:34:53
举报
文章被收录于专栏:飞鸟的专栏飞鸟的专栏
代码语言:javascript
复制
# 多个线程调用一个共享数据进行操作需要线程锁保证数据被正常使用
"""实现多线程减法,初始值为100,100个线程每个线程减1,最后值为0
1、设置sleep模拟IO阻塞
2、没有线程锁,在调用共享数据时,不会进行锁定,遇到IO阻塞时,会发生线程切换其他线程会拿到未被操作的数据,最后计算结果不正确
3、有线程锁时,在调用共享数据时,会进行锁定,直到锁释放,其他线程才能使用该数据,计算结果正确。
4、多线程中加锁的部分代码执行是单线程的,锁之外的部分是多线程
"""

# 示例1、delNum1是没有线程锁的,delNum2是有线程锁的
import threading
import time


def delnum1():
    global num1

    temp1 = num1
    time.sleep(0.001)   # 模拟IO阻塞
    num1 = temp1 - 1


def delnum2():
    global num2

    r.acquire()         # 加锁
    temp = num2
    time.sleep(0.0001)  # 模拟IO阻塞
    num2 = temp - 1
    r.release()         # 释放


if __name__ == '__main__':
    num1 = 100
    num2 = 100
    t1_list = []
    t2_list = []
    r = threading.Lock()    # 实例化线程锁对象

    for i in range(100):
        t1 = threading.Thread(target=delnum1)
        t2 = threading.Thread(target=delnum2)
        t1.start()
        t2.start()
        t1_list.append(t1)
        t2_list.append(t2)

    for t in t1_list:
        t.join()

    for t in t2_list:
        t.join()

    print('没有线程锁执行结果:{}'.format(num1))
    print('有线程锁执行结果:{}'.format(num2))

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com