互斥锁与多线程间共享全局变量
Posted fry-hell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互斥锁与多线程间共享全局变量相关的知识,希望对你有一定的参考价值。
互斥锁
一、 代码展示
① 没加锁(X)
import threading
num = 0
def write1():
global num
i = 1
while i <= 1000000:
num += 1
i += 1
print("result1:%d" % num)
def write2():
global num
i = 1
while i <= 1000000:
# 由于 num 是全局变量,但num += 1 是分三步执行的
# 若没有加锁,就会出现抢夺资源( num +=1 还没执行完,另一个线程拿这个变量去使用),就会导致 num 的最终值出现错误
num += 1
i += 1
print("result2:%d" % num)
def main():
# 创建两个线程
p1 = threading.Thread(target=write1)
p2 = threading.Thread(target=write2)
# 开启线程
p1.start()
p2.start()
if __name__ == "__main__":
main()
运行结果
result1:1180321
result2:1567595
以上 result2 结果不是一个定值,各种值情况都会出现
② 加了锁(√)
# 两个进程实现从队列中写一个,收一个数据
import threading
num = 0
def write1(lock):
global num
i = 1
while i <= 1000000:
lock.acquire()
num += 1
lock.release()
i += 1
print("result1:%d" % num)
def write2(lock):
global num
i = 1
while i <= 1000000:
# 由于 num 是全局变量,但num += 1 是分三步执行的
# 若没有加锁,就会出现抢夺资源( num +=1 还没执行完,另一个线程拿这个变量去使用),就会导致 num 的最终值出现错误
lock.acquire()
num += 1
lock.release()
i += 1
print("result2:%d" % num)
def main():
# 创建一个锁
lock = threading.Lock()
# 创建两个线程
p1 = threading.Thread(target=write1, args=(lock,))
p2 = threading.Thread(target=write2, args=(lock,))
# 开启线程
p1.start()
p2.start()
if __name__ == "__main__":
main()
运行结果
result1:1996142
result2:2000000
二、 总结
① 线程之间是共用全局变量的,因为线程是一个进程里分出来的几个任务,使用的是用同一份代码,同样的变量与资源。
② 互斥锁一般用在线程需要 共享全局变量 的时候
③ 进程与线程之间的关系与区别:
? ① 进程 包含 多个线程
? ② 进程间 不共用 变量与资源;线程间 共用 变量与资源
以上是关于互斥锁与多线程间共享全局变量的主要内容,如果未能解决你的问题,请参考以下文章