码迷,mamicode.com
首页 > 编程语言 > 详细

线程锁(互斥锁)

时间:2017-11-25 22:40:30      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:pen   threading   cos   计算   多线程   work   操作   UI   port   

1、线程锁

  当我们执行多线程计算时,某些情况,会导致计算的结果,并不是我们想要的真实的结果。

  例如下面的例子,预计结果sum=50,实际中多次运算的结果中,某些情况,不等于50;

  

import threading
import time

def worker(n):
print ("threading [%s] is begin!" % n)
global sum
sum+=1
time.sleep(2)
print ("threading [%s] is end!" % n)
start_time = time.time()
sum = 0
for i in range(50):
t = threading.Thread(target=worker,args = ("Thread-[%s]" % i,))
#t.setDaemon(True)#将子线程设置为守护线程
t.start()
print ("all is done !")
cost_time = time.time() - start_time
print (sum)
print (cost_time)

针对上面的例子,我们需要在计算的时候,添加线程锁,当填加了线程锁后,各线程在执行计算操作时,实际上变为串行
import threading
import time

def worker(n):
print ("threading [%s] is begin!" % n)
lock.acquire()
global sum
sum+=1
lock.release()
print ("threading [%s] is end!" % n)
start_time = time.time()
sum = 0
lock = threading.Lock()
#res_list = []
for i in range(50):
t = threading.Thread(target=worker,args = ("Thread-[%s]" % i,))
t.start()
#res_list.append(t)
# for t in res_list:
# t.join()
print ("all is done !")
cost_time = time.time() - start_time
print (sum)
print (cost_time)

多上述的例子来看,理论上加了锁,运行的结果,应该为想要的50,但从实际结果看,某些时候,依然运行不正确。
从结果看,有些线程未运行完成,主线程即结束了。如果加上join方法(即注释部分代码)后,多次结果的结果均为正确。
 

 

线程锁(互斥锁)

标签:pen   threading   cos   计算   多线程   work   操作   UI   port   

原文地址:http://www.cnblogs.com/wulafuer/p/7896600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!