http://ift.tt/2wrDX9T
python的多线程锁的问题
##多线程中关于锁的问题
import threading
g_nNum=0
def ThreadOC():
for i in range(1000000):
global g_nNum
g_nNum+=1
t1 =threading.Thread(name="t1",target=ThreadOC)
t2=threading.Thread(name="t2",target=ThreadOC)
t1.start()
t2.start()
t1.join()
t2.join()
print(g_nNum)
##问题解释
每次运行都可以看出,g_nNum的数据都是不一样的
是这样
我们现在用的cpu都是几核几核的 ,一个核心一次只能执行一条指令
cpu运行调用线程是不一定的,可能运行这个线程十几秒
然后调用另一个线程几秒
然后解释这个代码当中的多线问题
当2个线程共享一个全局变量的时候,cpu至少要做以下三组动作
把g_nNum的值取出来放到寄存器
寄存器中的值加+
把寄存器的值取出来给g_nNum(懂汇编的看一下汇编)
这么一来,假如线程1执行了100次,正在在+1的过程中,线程2进来了
线程2执行了105次 ,把数值给寄存器,那是不是线程1在刚刚被抢的时候做的运算的运算都白做了
所以为了要解决这个问题,引入了锁的概念
当一个线程操作数据的时候,锁住这个数据,只跟由这个线程操作,当线程不在操作这个数据的时候,释放资源
##问题解决
import threading
g_nNum = 0
lock =threading.Lock() #实例化锁对象
def ThreadOC():
for i in range(1000000):
lock.acquire() #获取锁
global g_nNum
g_nNum += 1
lock.release() # 释放锁
t1 = threading.Thread(name="t1", target=ThreadOC)
t2 = threading.Thread(name="t2", target=ThreadOC)
t1.start()
t2.start()
t1.join()
t2.join()
print(g_nNum)
当然,多线程的锁并不是这么用的,但是用来学习概念是无可厚非的
The post python的多线程锁的问题 appeared first on cole.
http://ift.tt/eA8V8J Python, python, python3, thread September 14, 2017 at 07:41PM
评论
发表评论