• 黄晓海的专栏作者中国国家地理网 2019-07-11
  • 合唱凝聚力量 文化引领发展 2019-06-27
  • 魏占军的专栏作者中国国家地理网 2019-06-26
  • 从朝美的对话和双方表现的诚意来看,形势正向好的方向发展。这应了中国那句解铃还需系铃人的老话,只有当事国之间的直接对话才能真正解决问题,其它都是弯路。 2019-06-21
  • 这是全国精气最为集中的地方 被称为中国丹田所在 ——凤凰网房产 2019-06-21
  • 屠呦呦,袁隆平都不是清华大学毕业,他们的科学贡献远大于清华大学毕业生。不要迷信名牌大学,要相信自己的努力。 2019-06-20
  • 深圳晚报总编辑丁时照祝贺人民日报创刊70周年 2019-06-15
  • 《北京市交通委员会 北京市环境保护局 北京市公安局公安交通管理局关于对部分载客汽车采取交通管理措施的通告》解读 2019-06-02
  • 2016环球医院院长领导力闭门会议在京举行 2019-06-02
  • 恩施一疯狗两天咬伤四村23人 警方出动将其击毙 2019-05-19
  • 足球王国群星璀璨 能否登顶第六冠 2019-05-19
  • 习近平倡议共为上合美好明天干杯! 2019-05-10
  • 爱这个世界——“凤凰好书榜6月榜”发布 2019-05-01
  • 美国在强化国内的经济发展,贸易战只有美国改变的战略方向才会停止,不然就会面对一切有损国家利益的项目打贸易战 2019-05-01
  • ECCO2016春夏流行趋势一览 让你的春天炫出彩虹 2019-04-30
  • 浙江12选5快乐彩:Python多线程,线程死锁及解决,生产者与消费者问题

    浙江体彩网20选5  发布时间:2019-07-10 14:06:31

    浙江体彩网20选5 www.xwlxr.com 本文关键词:多线程死锁的例子

    线程 死锁_多线程死锁的例子_c# 线程死锁

    Python多线程,线程死锁及解决,生产者与消费者问题

    普通调用

    t = Thread(target=test, args=(i,))  # test为目标函数名, 若函数需要参数将其以元组形                                                 # 式赋给args, 若无参数可不写  
    t.start()   # 用start()函数开启线程

    例子

    import time
    from threading import Thread
    # 目标函数
    def test(i):
        print("hello ", i)
        time.sleep(1)
    def main():
        # 循环5次,开起五个线程
        for i in range(5):
            t = Thread(target=test, args=(i,))  
            t.start()
    if __name__ == '__main__':
        main()

    继承Thread类

    定义一个自己的类继承自Thread,重写run()方法,即 将原本执行任务的函数内容移植到run()方法中.可通过类的属性传参.

    例子

    from threading import Thread
    import time
    class MyThread(Thread):
        def __init__(self, i):  
            Thread.__init__(self)   # 初始化父类"构造函数"
            self.i = i  # 初始化,目的将run函数参数作为类的属性
        def run(self):
            time.sleep(1)
            msg = "I'm " + self.name + " @ " + str(self.i)
            print(msg)
    def main():
        for i in range(3):  # 开启三个线程
            t = MyThread(i) # 实例化自己的类
            t.start()
    if __name__ == '__main__':
        main()

    多线程死锁的例子_线程 死锁_c# 线程死锁

    线程的执行顺序

    上面的例子中线程的执行顺序是随机的

    下面例子中test1()和test2()共享g_num全局变量.希望test1()执行的结果是1000000,test2()执行的结果是2000000.但是time.sleep()函数会影响结果.

    from threading import Thread
    import time
    g_num = 0
    def test1():
        global g_num
        for i in range(1000000):
            g_num += 1
        print('---test1 g_num is %d---' % g_num)
    def test2():
        global g_num
        for i in range(1000000):
            g_num += 1
        print('---test2 g_num is %d---' % g_num)
    t1 = Thread(target=test1)
    t1.start()
    # time.sleep(3) # 运行这句话与不运行这句话结果不一样
    t2 = Thread(target=test2)
    t2.start()
    print('-----g_num: %d-----' % g_num)

    不执行sleep函数的结果(可能出现多种不同的运行结果)

    ---test1 g_num is 1312283---
    -----g_num: 1312283-----
    ---test2 g_num is 1341534---

    执行sleep()函数的结果

    ---test1 g_num is 1000000---
    -----g_num: 1079982-----
    ---test2 g_num is 2000000---

    //队列组中的任务执行完毕之后,执行该函数。4、最后,我们等待期卸载完成即可,之后可以看到卸载完成提示,至此就成功完成了win10软件卸载了. 看完了编的卸载演示,有没有感觉在高大上的win10上进行卸载程序的操作也并没有想象的那样复杂.轻轻松松的四步,就能很快的搞定.相信您肯定对四个步骤肯定。通过pdca体系改变任务发布:明确任务目标和完成时间、通过科学手段跟踪任务的执行、检查并肯定每一个高效完成的任务、对成功的经验加以肯定并予以标准化。

    c# 线程死锁_多线程死锁的例子_线程 死锁

    from threading import Thread
    g_num = 0
    g_flag = 1  # 增加一个标识全局变量
    def test1():
        global g_num
        global g_flag
        if g_flag == 1:
            for i in range(1000000):
                g_num += 1
        g_flag = 0
        print('---test1 g_num is %d---' % g_num)
    def test2():
        global g_num
        # 轮询
        while True:
            if g_flag != 1: # 一旦test1()执行完,即g_flag = 0时,test2()开始执行累加g_num操作
                for i in range(1000000):
                    g_num += 1
                break
        print('---test2 g_num is %d---' % g_num)
    t1 = Thread(target=test1)
    t1.start()
    t2 = Thread(target=test2)
    t2.start()
    print('-----g_num: %d-----' % g_num)

    运行结果

    -----g_num: 303721-----
    ---test1 g_num is 1000000---
    ---test2 g_num is 2000000---

    第二个线程一开始并没有执行累加g_num的操作,而是先进行一个死循环,在这个循环中不断的"询问"g_flag的值是否不等于1.一但g_flag不等于1,即test1()结束后便开始干"正事".

    from threading import Thread, Lock  # 导入互斥锁
    g_num = 0
    def test1():
        global g_num
        for i in range(1000000):
            mutex.acquire()  # 上锁,此时其他的锁会等待  上锁应该遵循最原则
            g_num += 1
            mutex.release() # 开锁,此时其他的锁会抢着开锁
        print('---test1 g_num is %d---' % g_num)
    def test2():
        global g_num
        for i in range(1000000):
            mutex.acquire()
            g_num += 1
            mutex.release()
        print('---test2 g_num is %d---' % g_num)
    # 创建一把互斥锁,默认不上锁
    mutex = Lock()
    t1 = Thread(target=test1)
    t1.start()
    t2 = Thread(target=test2)
    t2.start()
    print('-----g_num: %d-----' % g_num)

    运行结果

    -----g_num: 45012-----
    ---test1 g_num is 1979942---
    ---test2 g_num is 2000000---

    从结果可以看出test2()的结果是正确的,而test1()的结果很接近test2.这也不难理解.互斥锁会把夹在中间的部分锁定,也就是说,在极短时间内只能有一个线程在执行该代码.一旦开锁了(release),所有线程开始抢这把锁,某个线程抢到之后会把自己的操作锁住,其他线程只能等待,一直反复直至全部任务完成.

    只有对上述代码稍微修改便可以实现我们想要的结果

    c# 线程死锁_多线程死锁的例子_线程 死锁

    修改后的代码

    from threading import Thread, Lock  # 导入互斥锁
    g_num = 0
    def test1():
        global g_num
        mutex.acquire()  # 上锁,此时其他的锁会等待  上锁应该遵循最原则
        for i in range(1000000):
            g_num += 1
        mutex.release() # 开锁,此时其他的锁会抢着开锁
        print('---test1 g_num is %d---' % g_num)
    def test2():
        global g_num
        mutex.acquire()
        for i in range(1000000):
            g_num += 1
        mutex.release()
        print('---test2 g_num is %d---' % g_num)
    # 创建一把互斥锁,默认不上锁
    mutex = Lock()
    t1 = Thread(target=test1)
    t1.start()
    t2 = Thread(target=test2)
    t2.start()
    print('-----g_num: %d-----' % g_num)

    结果

    -----g_num: 220254-----
    ---test1 g_num is 1000000---
    ---test2 g_num is 2000000---

    值得注意的是,互斥锁上的范围太大就失去了线程的意义,别的线程都把时间浪费在了等待上.轮询同理.

    from threading import Thread
    import threading
    import time
    def test1():
        name = threading.current_thread().name  # 获取当前线程名字
        print('----thread name is %s----' % name)
        g_num = 100
        if name == 'Thread-1':
            g_num += 1
        else:
            time.sleep(2)
        print('---thread is %s | g_num is %d---' % (name, g_num))
    t1 = Thread(target=test1)
    t1.start()
    t2 = Thread(target=test1)
    t2.start()

    运行结果

    ----thread name is Thread-1----
    ---thread is Thread-1 | g_num is 101---
    ----thread name is Thread-2----
    ---thread is Thread-2 | g_num is 100---

    非全局对于同一个函数来说.可以通过线程的名字来区分.

    线程 死锁_c# 线程死锁_多线程死锁的例子

    import threading
    import time
    class MyThread1(threading.Thread):
        def run(self):
            if mutexA.acquire():
                print(self.name + '---do1---up---')
                time.sleep(1)
                if mutexB.acquire():
                    print(self.name + '---do1---down---')
                    mutexB.release()
                mutexA.release()
    class MyThread2(threading.Thread):
        def run(self):
            if mutexB.acquire():
                print(self.name + '---do2---up---')
                time.sleep(1)
                if mutexA.acquire():
                    print(self.name + '---do2---down---')
                    mutexA.release()
                mutexB.release()
    if __name__ == '__main__':
        mutexA = threading.Lock()
        mutexB = threading.Lock()
        t1 = MyThread1()
        t2 = MyThread2()
        t1.start()
        t2.start()

    本文来自互联网,由机器人自动采编,文章内容不代表本站观点,请读者自行辨别信息真伪,如有发现不适内容,请及时联系站长处理。

    相关阅读
  • 黄晓海的专栏作者中国国家地理网 2019-07-11
  • 合唱凝聚力量 文化引领发展 2019-06-27
  • 魏占军的专栏作者中国国家地理网 2019-06-26
  • 从朝美的对话和双方表现的诚意来看,形势正向好的方向发展。这应了中国那句解铃还需系铃人的老话,只有当事国之间的直接对话才能真正解决问题,其它都是弯路。 2019-06-21
  • 这是全国精气最为集中的地方 被称为中国丹田所在 ——凤凰网房产 2019-06-21
  • 屠呦呦,袁隆平都不是清华大学毕业,他们的科学贡献远大于清华大学毕业生。不要迷信名牌大学,要相信自己的努力。 2019-06-20
  • 深圳晚报总编辑丁时照祝贺人民日报创刊70周年 2019-06-15
  • 《北京市交通委员会 北京市环境保护局 北京市公安局公安交通管理局关于对部分载客汽车采取交通管理措施的通告》解读 2019-06-02
  • 2016环球医院院长领导力闭门会议在京举行 2019-06-02
  • 恩施一疯狗两天咬伤四村23人 警方出动将其击毙 2019-05-19
  • 足球王国群星璀璨 能否登顶第六冠 2019-05-19
  • 习近平倡议共为上合美好明天干杯! 2019-05-10
  • 爱这个世界——“凤凰好书榜6月榜”发布 2019-05-01
  • 美国在强化国内的经济发展,贸易战只有美国改变的战略方向才会停止,不然就会面对一切有损国家利益的项目打贸易战 2019-05-01
  • ECCO2016春夏流行趋势一览 让你的春天炫出彩虹 2019-04-30
  • 双色球综合走势图 河内5分彩全天计划网址 通比牛牛游戏介绍 云南快乐十分开奖号查询 大红鹰网高手论坛公式规律心水 泳坛夺金缩水 体彩p3试机号今天晚上 广西快三时时彩 中国乒乓球最新消息 北单在哪买2019 福建31选7中4个奖多少钱 彩票开奖12选5辽宁省 湖南幸运赛车近1000期 025期平码公式规律 网易网球比分直播