线程5 同步概念,互斥锁解决资源竞争问题

同步
互斥锁
使用互斥锁解决资源竞争

同步概念

同步就是协同步调,按预定的先后次序进行运行,如:你说完,我再说。 ‘同’字从字面上容易理解为一起动作
其实不是,‘同’字应是指协同,协助,互相配合。

互斥锁

当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制。
线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。类似于数据库操作的事务。
互斥锁为资源引入一大状态:锁定/非锁定

某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成”非锁定“,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

基本操作:

  • 创建锁
mutex =threading.lock()`
  • 锁定
mutex.acquire()
  • 释放
mutex.release()
注意:
  • 如果这个锁之前是没有上锁的,那么acquire不会堵塞。
  • 如果在调用acquire对这个锁上锁之前,它已经被其他线程上了锁,那么此时acquire会堵塞,直到这个锁被解锁为止。

使用互斥锁

使用互斥锁完成2个线程对同一个全局变量各加100万次的操作

第一步创建一个互斥锁

mutex = threading.Lock()

第二步对线程1进行上锁,完成步骤后解锁

def Text1(nums):
    global g_num
    # 上锁
    mutex.acquire()
    for i in range(nums):
        g_num += 1
    # 解锁
    mutex.release()
    print("In Text1----",g_num)

第三部对线程2进行上锁,完成步骤后解锁

def Text2(nums):
    global g_num
    #上锁
    mutex.acquire()
    for i in range(nums):
        g_num += 1
    # 解锁
    mutex.release()
    print("In Text2----",g_num)

总代码
import threading
import time
    # global告诉python这是g_num一个全局变量
    # threading.Lock:互斥锁    1个开锁,1个关锁 两个方法acquire release
g_num = 0
# 创建一个互斥锁,默认是没有上锁的(全局变量)
mutex = threading.Lock()
def Text1(nums):
    global g_num
    # 上锁
    mutex.acquire()
    for i in range(nums):
        g_num += 1
    # 解锁
    mutex.release()
    print("In Text1----",g_num)

def Text2(nums):
    global g_num
    #上锁
    mutex.acquire()
    for i in range(nums):
        g_num += 1
    # 解锁
    mutex.release()
    print("In Text2----",g_num)


def main():
    # 分别传入100 和 1000000
    t1 = threading.Thread(target= Text1,args=(1000000,))
    t2 = threading.Thread(target= Text2,args=(1000000,))
    t1.start()
    t2.start()


if __name__ == '__main__':
    main()

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值