6.2多线程-互斥锁/死锁
互斥锁-解决资源竞争问题
方案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多线程-互斥锁/死锁相关推荐
- java多线程互斥锁_浅谈Java多线程互斥锁
为了解决竞争条件带来的问题,我们可以对资源上锁.多个线程共同读写的资源称为共享资源,也叫临界资源.涉及操作临界资源的代码区域称为临界区(Critical Section).同一时刻,只能有一个线程进入 ...
- Python多线程--互斥锁、死锁
1.互斥锁 为解决资源抢夺问题,使用mutex = Threading.Lock()创建锁,使用mutex.acquire()锁定,使用mutex.release()释放锁. 代码一: import ...
- 【C++】多线程互斥锁、条件变量
我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...
- java多线程- 互斥锁 自旋锁
如果一个资源会被不同的线程访问修改,那么我们把这个资源叫做临界资源(<操作系统>),那么对于该资源访问修改相关的代码就叫做临界区.引入互斥锁即解决多个线程之间共享同一个共享资源,这是多线程 ...
- C++多线程 互斥锁 信号量 事件 临界区
一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...
- 【Linux】多线程--互斥锁
文章目录 前言 基础概念 互斥量mutex 多线程模拟抢票(没加锁情况) 为何多线程访问临界资源是不安全 互斥锁相关接口 多线程模拟抢票(有加锁) 互斥锁实现的基本原理 前言 为什么线程需要同步和互斥 ...
- python多线程锁_Python多线程互斥锁使用
# 代码 # coding=utf-8 """通过使用互斥锁,锁定全局变量,防止数据异常""" import threading num = ...
- c语言多线程互斥锁示例
#include<pthread.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h>p ...
- 互斥锁、死锁、递归锁、信号量、Event
互斥锁 死锁和递归锁 Semaphore信号量 Event事件 互斥锁 互斥锁也叫用户锁.同步锁. 在多进程/多线程程序中,当多个线程处理一个公共数据时,会有数据安全问题,唯一能保证数据安全的,就是通 ...
最新文章
- IDEA 调试Spring-boot 应用
- DL之GAN:生成对抗网络GAN的简介、应用、经典案例之详细攻略
- 网络流 (EK Dinic)
- loading 遮罩demo
- mysql跳过安全_Navicat连接MySQL数据库
- Linux系统编程9:进程入门之操作系统为什么这么重要以及它是如何实现管理的
- python3什么意思_python3是什么意思啊
- 安装Linux操作系统
- ffmpeg之PCM转AAC
- tcp欢动窗口机制_Linux网络编程面试--滑动窗口的实现机制
- 【工具】telnet用法
- AutoCAD 百度网盘免费下载
- HDB3 的编码与译码 ①(MATLAB 实现)2021-9-11
- 10分钟带你读完人工智能的三生三世
- kvaser 驱动修复(linux)
- python实现格兰杰因果关系检验
- win10系统幻灯片播放卡顿
- 史上最强!PC时代的20位英雄(组图)
- 2020最火爆BI产品对比来啦!亿信ABI VS FineBI数据分析谁最行
- 一篇文章带你搞懂微信小程序的开发过程