前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >互斥锁

互斥锁

作者头像
py3study
发布2020-01-17 14:28:26
7830
发布2020-01-17 14:28:26
举报
文章被收录于专栏:python3python3

作用:

  解决资源竞争问题

死锁:

  当一组线/进程中的每个线/进程都在等待某个事件发生,而只有这组线/进程中的其他进程才能触发该事件,这就称这组线/进程发生了死锁。

  创建的锁过多,可能会造成死锁问题。

  可以在设计程序时从逻辑上避免死锁出现,延时、银行家算法等

# 以下代码如未使用互斥锁,最终计算出来的的数值会出错(比实际数小)

# 上锁的代码越少越好,只在关键位置加锁
import threading
import time


# 定义一个全局变量
g_num = 0

# 创建一个互斥锁,默认没有上锁
mutex = threading.Lock()


def func1(num):
    global g_num
    # 如上锁之前没有上锁,此时上锁成功
    # 如上锁之前已被上锁,此时会堵塞在这里,直到锁被解开
    for i in range(num):
        # 上锁
        mutex.acquire()
        g_num += 1
        # 解锁
        mutex.release()
    print("in func1 g_num=%d" % g_num)


def func2(num):
    global g_num
    for i in range(num):
        # 上锁
        mutex.acquire()
        g_num += 1
        # 解锁
        mutex.release()
    print("in func2 g_num=%d" % g_num)


def main():
    # target指定将来这个线程去哪个函数执行代码
    # args指定将来调用函数的时候,传递什么数据过去
    t1 = threading.Thread(target=func1, args=(1000000,))
    t2 = threading.Thread(target=func2, args=(1000000,))

    t1.start()
    t2.start()

    # 等待上面2个线程执行完毕..
    time.sleep(5)

    print("in main Thread g_num=%d" % g_num)


if __name__ == "__main__":
    main()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档