Thread and shared lock
在看programing python 4th,第5张parallel system tool 192页开始,书中讲到thread知识,以下做个笔记,以便后期学习
1.主线程执行,开启5个子线程进行计数,没有使用mutex锁住,所以线程没有lock住资源,每个线程对全局变量的操作错乱,结果如下:
"""
synchronize access to stdout: because it is shared global
thread outputs may be intermixed if not syschronized
"""
import thread,time
global num #global var to be used by many threads
num=0 def cnt(id,count): # function run in threads
for i in range(count):
global num
#mutex.acquire() # lock the share var before execute
num +=1
time.sleep(0.5) # simulate read work
print('[%s] num= %s\n' %(id,num)) #print isn't interrupted now
#mutex.release() #release the lock for the other thread if __name__ =="__main__":
#mutex=thread.allocate_lock() #make a global mutex for lock
for i in range(5): #spawm 5 threads
thread.start_new_thread(cnt,(i,3)) #start threads
time.sleep(8) # wait for spawn thread work done,don't exit too early print('main thread exitting')

2.把mutex 注释打开,有了mutex变量,每一个线程进入都会独占num变量,结果如下:
"""
synchronize access to stdout: because it is shared global
thread outputs may be intermixed if not syschronized
"""
import thread,time
global num #global var to be used by many threads
num=0 def cnt(id,count): # function run in threads
for i in range(count):
global num
mutex.acquire() # lock the share var before execute
num +=1
time.sleep(0.5) # simulate read work
print('[%s] num= %s\n' %(id,num)) #print isn't interrupted now
mutex.release() #release the lock for the other thread if __name__ =="__main__":
mutex=thread.allocate_lock() #make a global mutex for lock
for i in range(5): #spawm 5 threads
thread.start_new_thread(cnt,(i,3)) #start threads
time.sleep(8) # wait for spawn thread work done,don't exit too early print('main thread exitting')

3.如果把time.sleep(6)注释掉或者子线程没有执行完毕,而主线程sleep的时间一到,主线程直接退出而不等待子线程执行完毕,结果如下:
a.主线程不等待,则直接退出

b.主线程只等待3s,而5个子线程需要7.5s,所以num只计数5.

4.设定有效等待时间和锁之后,主线程等待所有子线程执行结束才退出,结果如下:

6.无需在主线程设置等待时间,而是设定单独的锁或者变量来记录每个子线程的执行状态,每执行完一个线程,设定状态锁,然后在主线程判断所有状态锁的状态即可
"""
used mutexex to know when threads are done in parent/main thread,
instead of time.sleep;lock stdout to avoid comingled prints
"""
import thread,time
global num
num =0 def cnt(id,count):
for i in range(count):
global num
stdoutmutex.acquire()
num +=1
time.sleep(0.5)
print('[%s] num= %s time:[%s]\n' %(id,num,time.ctime())) #print isn't interrupted now
stdoutmutex.release()
#exitmutexs[id].acquire() # signal main thread
exitFlags[id] = True #signal main thread if __name__ =="__main__":
stdoutmutex = thread.allocate_lock() #make a global mutex for lock
#exitmutexs = [thread.allocate_lock() for i in range(5)]
exitFlags=[False]*5
for i in range(5): #spawm 5 threads
thread.start_new_thread(cnt,(i,3)) #start threads
#for mutex in exitmutexs:
# while not mutex.locked():
# pass
while False in exitFlags:pass
print('main thread exitting')

Thread and shared lock的更多相关文章
- Thread Based Parallelism - Thread Synchronization With Lock
Thread Based Parallelism - Thread Synchronization With Lock import threading shared_resource_with_lo ...
- 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)
深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...
- Java Concurrency In Practice -Chapter 2 Thread Safety
Writing thread-safe code is managing access to state and in particular to shared, mutable state. Obj ...
- How to Analyze Java Thread Dumps--reference
原文地址:http://architects.dzone.com/articles/how-analyze-java-thread-dumps The Performance Zone is pres ...
- Thread in Java
References: [1]. http://www.javaworld.com/article/2074481/java-concurrency/java-101--understanding-j ...
- How to Analyze Java Thread Dumps
When there is an obstacle, or when a Java based Web application is running much slower than expected ...
- Do waiting or suspended tasks tie up a worker thread?
https://blogs.msdn.microsoft.com/askjay/2012/07/29/do-waiting-or-suspended-tasks-tie-up-a-worker-t ...
- Android Process & Thread
Native Service and Android Service Native Service:In every main() method of NativeService, which is ...
- PatentTips - Managing sequenced lock requests
BACKGROUND In a multi-threaded processing environment, two or more threads may require access to a c ...
随机推荐
- JS:事件处理程序
在JQuery中有个toggle事件,可以绑定两个或多个函数,可以轮流相应click事件,这两天学习到原来javascript中有两个方法(也可以说是四个)同样可以实现这个功能. #box{ marg ...
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- PHP TCPDF ERROR: [Image] Unable to get image解决办法详解
使用TCPDF输出pdf文件时,有时会直接显示pdf文件不可显示,仔细调试之下会报错TCPDF ERROR: [Image] Unable to get image.问题出现Image()函数中.第一 ...
- doT.js详细介绍
doT.js详细介绍 doT.js特点是快,小,无依赖其他插件. 官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolati ...
- java异常捕获
类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断: try { throw new ExampleB("b") } catch(E ...
- JsonTest
以前用MVC写网站时并不用考虑Json的转换,MVC已经提供了现成的方法. 现在没有用MVC,我就在考虑如何自己转换Json,想来想去自己写还是不够完美,于是尝试了一些其他人写的方法,尝试过微软提供的 ...
- UI控件闪烁及刷新
我们常常在一个窗口上放置很多控件,在改变窗口大小时,控件会跟着一起闪烁... 此时,可以将窗口添加WS_CLIPCHILDREN属性即可.(如果包含多层,都需要WS_CLIPCHILDREN属性) 默 ...
- ZOJ 2771
Description Considering a light entering three adjacent planes of glass. At any meeting surface, t ...
- DateUtil工具类
package com.autoserve.mh.common.util; import java.text.SimpleDateFormat; import java.util.Calendar ...
- DS实验题 融合软泥怪-2 Heap实现
题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...