# 多个线程调用一个共享数据进行操作需要线程锁保证数据被正常使用
"""实现多线程减法,初始值为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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有