在看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的更多相关文章

  1. Thread Based Parallelism - Thread Synchronization With Lock

    Thread Based Parallelism - Thread Synchronization With Lock import threading shared_resource_with_lo ...

  2. 深入理解Java并发框架AQS系列(四):共享锁(Shared Lock)

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock) 深入 ...

  3. 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 ...

  4. How to Analyze Java Thread Dumps--reference

    原文地址:http://architects.dzone.com/articles/how-analyze-java-thread-dumps The Performance Zone is pres ...

  5. Thread in Java

    References: [1]. http://www.javaworld.com/article/2074481/java-concurrency/java-101--understanding-j ...

  6. How to Analyze Java Thread Dumps

    When there is an obstacle, or when a Java based Web application is running much slower than expected ...

  7. 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 ...

  8. Android Process & Thread

    Native Service and Android Service Native Service:In every main() method of NativeService, which is ...

  9. PatentTips - Managing sequenced lock requests

    BACKGROUND In a multi-threaded processing environment, two or more threads may require access to a c ...

随机推荐

  1. 创建DOTA2本地数据库(一)

    在APP中,用本地数据库好于频繁的联网去获取相关数据.我使用SQLite作为本地的数据库,比较轻巧. 英雄 首先先建立英雄的数据库,暂时我先只设置ID,name,loaclized_name这三种,我 ...

  2. 【最简单IOC容器实现】实现一个最简单的IOC容器

    前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...

  3. 如何激活win10 win10激活工具下载

    http://www.2cto.com/os/201511/448815.html 官方的win10出来了,可是装在上电脑后要花钱才能用,费用要好几百呢,感觉很不值得,这里我教给大家个免费激活官方wi ...

  4. 去除DataTable中的重复数据

    有时需要从DataTable中抽取Distinct数据,遍历比较费劲,C#.NET中其实有更易用的方法,如下: string[] columnArray = { "columnName1&q ...

  5. Tomcat常见问题汇总

    1.在服务器上一定要开启-server参数 #直接在一堆注释下添加即可 #即是在 # OS specific support.注释之前 JAVA_OPTS= -server 2.tomcat启动很慢  ...

  6. Java算法之字符串反转分析

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在基本的工作内容开发中,算法不会显得那么重要,而在百万级别的时候,差距非常大,今天带大家研究下常见的 ...

  7. PostgreSQL windows service启动失败

    from: http://stackoverflow.com/questions/1251233/unable-to-run-postgresql-as-windows-servicepg_ctl - ...

  8. 【leedcode】 Median of Two Sorted Arrays

    https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 and num ...

  9. Session与Cookie概念

    摘:一.Session机制session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session的时候,服务 ...

  10. css加载优化

    <head> <script> // https://github.com/filamentgroup/loadCSS !function(e){"use stric ...