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 ...
随机推荐
- 你应该在开始API开发之前知道的事(上)(翻译)
这篇文章的源地址:http://dev.dota2.com/showthread.php?t=58317 由于文章内容较多,英语水平有限,准备尝试着以中英混搭的形式翻译,免得曲解一些不懂内容的意思.以 ...
- linux中test与[ ]指令的作用
linux中test与[ ]指令的作用: 在Linux中,test和[ ]功能是一样的,类似于c语言中的( ).不过Linux的test和[ ]是指令.在和if或者while联用时要用空格分开.
- 将f2fs文件系统到磁盘
1· 用git下载f2fs文件系统tools的源代码.下载地址如下:http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.g ...
- SSH框架简化
通过对ssh框架有了基础性的学习,本文主要是使用注解的方式来简化ssh框架的代码编写. 注意事项: 1.运行环境:Windows 8-64位,Eclipse(开发工具),jdk1.8.0_91,Tom ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
- <把时间当做朋友>读书笔记
这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...
- cloudera learning1:cloudera简介及安装
cloudera分为两个部分:CDH和CM.CDH是Cloudera Distribution Hadoop的简称,顾名思义,就是cloudera公司发布的Hadoop版本,封装了Apache Had ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- LeetCode Total Hamming Distance
原题链接在这里:https://leetcode.com/problems/total-hamming-distance/ 题目: The Hamming distance between two i ...
- cmd导入导出
2:用cmd进入命令行输入:tnsping cmstar就是测试172.18.13.200是否连接成功3:导入与导出,如下: 数据导出: 1 将数据库TEST完全导出,用户名system 密码mana ...