互斥锁-解决资源竞争问题

方案1,两个线程其中一个上锁,执行完这个线程再执行下一个线程

#coding:utf-8
import threading
import time# 创建一个全局变量
g_num = 0def test1(num):global g_num# 上锁,如果之前没有上锁,那么此时上锁成功# 如果上锁之前已经被上锁了,那么此时会堵塞在这里,直到锁被解开mutex.acquire()for i in range(num):g_num += 1# 解锁mutex.release()print('----in test1 g_num = %d' % g_num)def test2(num):global g_numfor i in range(num):g_num += 1print('----in test2 g_num = %d' % g_num)# 创建一个互斥锁,默认没有上锁
mutex = threading.lock()def main():# target 指定将来这个线程去哪个函数执行代码# args 指定将来调用这个函数的时候传递什么数据过去t1 = threading.Thead(target=test1, args = (1000000,))  #元组t2 = threading.Thead(target=test2, args = (1000000,))  #元组t1.start()t2.start()time.sleep(5)  # 等待上面两个线程执行完毕print('----in main Thread g_num = %d' % g_num)if __name__ == '__main__':main()

方案2,每次循环计算都上锁,两个线程轮流执行

#coding:utf-8
import threading
import time# 创建一个全局变量
g_num = 0def test1(num):global g_num# 上锁,如果之前没有上锁,那么此时上锁成功# 如果上锁之前已经被上锁了,那么此时会堵塞在这里,直到锁被解开for i in range(num):mutex.acquire()g_num += 1mutex.release()print('----in test1 g_num = %d' % g_num)def test2(num):global g_numfor i in range(num):mutex.acquire()g_num += 1mutex.release()print('----in test2 g_num = %d' % g_num)# 创建一个互斥锁,默认没有上锁
mutex = threading.lock()def main():# target 指定将来这个线程去哪个函数执行代码# args 指定将来调用这个函数的时候传递什么数据过去t1 = threading.Thead(target=test1, args = (1000000,))  #元组t2 = threading.Thead(target=test2, args = (1000000,))  #元组t1.start()t2.start()time.sleep(5)  # 等待上面两个线程执行完毕print('----in main Thread g_num = %d' % g_num)if __name__ == '__main__':main()

死锁

#coding:utf-8
import threading
import timeclass MyThread1(threading.Thread):def run(self):# d对mutexA上锁mutexA.acquire()# muteA上锁后,延时1秒,等待另外那个线程,把mutexB上锁print(self.name + '___do1---start----')time.sleep(1)# 此时会堵塞,因为这个mutexB已经被另外的线程抢先上锁了mutexB.acquire()print(self.name + '___do1---end----')mutexB.release()# 对mutexA解锁mutexA.release()
class MyThread2(threading.Thread):def run(self):# 对mutexB上锁mutexB.acquire()# mutexB上锁后,延时1秒,等待那个线程 把muteA上锁print(self.name + '___do2---start----')time.sleep(1)# 此时会堵塞,因为这个mutexA已经被另外的线程抢先上锁了metexA.acquire()print(self.name + '___do2---end----')mutexA.release()# 对mutexB解锁mutexB.release()mutexA = threading.lock()
mutexB = threading.lock()if __name__ == '__main__':t1 = MyThread1()t2 = MyThread2()t1.start()t2.start()

解决死锁问题-1 程序设计时尽量避免(银行家算法)

解决死锁问题-2 添加超时时间

6.2多线程-互斥锁/死锁相关推荐

  1. java多线程互斥锁_浅谈Java多线程互斥锁

    为了解决竞争条件带来的问题,我们可以对资源上锁.多个线程共同读写的资源称为共享资源,也叫临界资源.涉及操作临界资源的代码区域称为临界区(Critical Section).同一时刻,只能有一个线程进入 ...

  2. Python多线程--互斥锁、死锁

    1.互斥锁 为解决资源抢夺问题,使用mutex = Threading.Lock()创建锁,使用mutex.acquire()锁定,使用mutex.release()释放锁. 代码一: import ...

  3. 【C++】多线程互斥锁、条件变量

    我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...

  4. java多线程- 互斥锁 自旋锁

    如果一个资源会被不同的线程访问修改,那么我们把这个资源叫做临界资源(<操作系统>),那么对于该资源访问修改相关的代码就叫做临界区.引入互斥锁即解决多个线程之间共享同一个共享资源,这是多线程 ...

  5. C++多线程 互斥锁 信号量 事件 临界区

    一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...

  6. 【Linux】多线程--互斥锁

    文章目录 前言 基础概念 互斥量mutex 多线程模拟抢票(没加锁情况) 为何多线程访问临界资源是不安全 互斥锁相关接口 多线程模拟抢票(有加锁) 互斥锁实现的基本原理 前言 为什么线程需要同步和互斥 ...

  7. python多线程锁_Python多线程互斥锁使用

    # 代码 # coding=utf-8 """通过使用互斥锁,锁定全局变量,防止数据异常""" import threading num = ...

  8. c语言多线程互斥锁示例

    #include<pthread.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h>p ...

  9. 互斥锁、死锁、递归锁、信号量、Event

    互斥锁 死锁和递归锁 Semaphore信号量 Event事件 互斥锁 互斥锁也叫用户锁.同步锁. 在多进程/多线程程序中,当多个线程处理一个公共数据时,会有数据安全问题,唯一能保证数据安全的,就是通 ...

最新文章

  1. IDEA 调试Spring-boot 应用
  2. DL之GAN:生成对抗网络GAN的简介、应用、经典案例之详细攻略
  3. 网络流 (EK Dinic)
  4. loading 遮罩demo
  5. mysql跳过安全_Navicat连接MySQL数据库
  6. Linux系统编程9:进程入门之操作系统为什么这么重要以及它是如何实现管理的
  7. python3什么意思_python3是什么意思啊
  8. 安装Linux操作系统
  9. ffmpeg之PCM转AAC
  10. tcp欢动窗口机制_Linux网络编程面试--滑动窗口的实现机制
  11. 【工具】telnet用法
  12. AutoCAD 百度网盘免费下载
  13. HDB3 的编码与译码 ①(MATLAB 实现)2021-9-11
  14. 10分钟带你读完人工智能的三生三世
  15. kvaser 驱动修复(linux)
  16. python实现格兰杰因果关系检验
  17. win10系统幻灯片播放卡顿
  18. 史上最强!PC时代的20位英雄(组图)
  19. 2020最火爆BI产品对比来啦!亿信ABI VS FineBI数据分析谁最行
  20. 一篇文章带你搞懂微信小程序的开发过程

热门文章

  1. 数藏行业周报(06.06-06.13)
  2. python修改注册表,
  3. 基于FPGA的以太网芯片W5300的tcp/ip协议的开发
  4. tf.split()函数(非常清晰简单的解释)
  5. php四则运算出题器_四则运算题目生成器
  6. Z世代工程文化:如何带好95后工程师组成的开发团队?
  7. 【私有云架构】Cloudstack 与 OpenStack:哪个更适合您?
  8. 记一枚蒟蒻的数模国赛参赛经历
  9. python将姓王的都改成老王_老王Python基础+进阶+项目篇(高清无密)
  10. 老王决策规划算法凸优化与非凸优化