搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
不正经
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
使用vba获取excel每个sheet页的名称,并在目录页生成超级链接
2
自然语言处理:人机交流的桥梁
3
JVM调优参数简介、调优目标及调优经验
4
2024移动应用的发展趋势,开发者如何抢占变现先机?
5
大模型-提示词工程_大模型提示词工程 参照xx
6
大数据毕业设计hadoop+spark+hive+nlp知识图谱课程推荐系统 慕课在线教育课程数据分析可视化大屏 课程爬虫 文本分类 LSTM情感分析 计算机毕业设计 机器学习 深度学习 人工智能_spark、hadoop课程
7
嵌入式工程师的入门须知----亲测_嵌入式工程师入门
8
代码随想录第27天 | 39. 组合总和、40.组合总和II、131.分割回文串
9
NLP预训练模型综述_chinese mobilebert详解
10
(pytorch) bert-base-chinese模型文件下载_bert-base-chinese下载
当前位置:
article
> 正文
多线程的几种加锁方式详解
作者:不正经 | 2024-03-28 17:36:59
赞
踩
多线程的几种加锁方式详解
NSLock
NSLock是Cocoa提供给我们最基本的锁对象,这也是我们经常使用的,除lock和unlock外,NSLock还提供了tryLock和lockBeforeDate:两个方法,前一个方法会尝试加锁,如果锁不可用(已经被锁住),并不会阻塞线程,直接返回NO。后一个方法则会在指定的Date之前尝试加锁,如果在指定的时间内都不能加锁,则返回NO
synchronized(互斥锁)
synchronized会创建一个异常捕获handler和一些内部的锁,所以使用@synchronized替换普通锁的代价是要付出更多的时间消耗
创建给给@synchronized指令的对象是一个用来区别保护块的唯一标识符。如果你在两个不同的线程里面执行上述方法,每次在一个线程传递了一个不同的对象给anObj参数,那么每次都将会拥有它的锁,并持续处理,中间不会被其他线程阻塞。然而如果你传递的是同一个对象,那么多个线程中的一个线程会首先获得该锁,而其他线程将会被阻塞直到第一个线程完成它的临界区
作为一个预防措施。@synchronized块隐式的添加一个异常处理例程来保护代码,该处理例程会在异常抛出的时候自动的释放互斥锁,这就意味着为了使用@synchronized指令,你必须在你的代码中启用异常处理。如果你不想让隐式的异常处理例程带来额外的开销,那么可以使用其他的锁
atomic
atomic只是给成员变量的set和get方法加了一个锁,防止多线程一直去读写这个成员变量。但这也仅仅是对读写的锁定,并不是线程安全。而且使用atomic比nonatomic慢了将近20倍
OSSpinlock
自旋锁
耗时最少
自旋锁几乎不进入内核,仅仅是重新加载自旋锁
如果自旋锁被占用时间在一百纳秒以内,性能还是比较高的,因为减少了代价较高的系统调用和一系列的上下文切换
但是该锁不是万能的,如果该锁占用的时间比较多的时候,使用该锁会导致占用的cpu较多
pthread_mutex
是底层的API,在各种加锁方式中属于性能比较高的
如果自旋锁占用的时间比较多,那么使用pthread是一个不错的选择
NSConditionLock(条件锁)
条件锁与特定的与用户定义的条件有关,它可以确保一个线程可以获取满足一定条件的锁
内部涉及到信号量机制,一旦一个线程获取锁以后,它可以放弃锁并设置相关条件,这时候其他锁竞争该锁
线程之间的竞争激烈,涉及到条件锁检测、线程间通信、系统调用,上下文切换比较频繁
NSRecursiveLock递归锁
NSRecursiveLock实际上定义的是一个递归锁,这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或者递归操作中
总结:
如果只是粗略的使用锁,不考虑性能可以使用synchronized
如果对效率有较高的要求,采用OSSpinLock
因为pthread的锁也是使用OSSpinLock实现的,而且在OSSpinLock的实现过程中,并没有进入系统kernel,使用OSSpinLock可以节省系统调用和上下文切换
NSLock/NSConditionLock/NSRecursive耗时接近。220ms左右
dispatch_barrier_async的性能并没有我们想象中的纳闷好,这与线程同步调度开销有关
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/不正经/article/detail/330272
推荐阅读
article
基于
Linux
的更新版
MaxPatrol
VM
可扫描
Windows
...
3.扩展了启动扫描任务的参数:现在可以设置日期、时间和频率,如果需要卸载网络,也可以暂停任务,然后从暂停的资产继续分析。...
赞
踩
article
android
rom
工作,
Android
ROM
开发(4)
bootloader
三种
启动
模式
...
Andrew Huang 转载请注明作者及网址HTC手机中用的
bootloader
称为HBoot,不知道是不是HTC B...
赞
踩
article
智能
优化
算法
应用:基于袋獾
算法
3D
无线
传感器
网络(
WSN
)
覆盖
优化
- 附代码...
摘要:本文主要介绍如何用袋獾
算法
进行3D
无线
传感器
网(
WSN
)
覆盖
优化
。智能
优化
算法
应用:基于袋獾
算法
3D
无线
传感器
网络...
赞
踩
article
【
数据
分析
与挖掘】
天猫
超市
复购
预测
实战(含代码和
数据
集)
_
天猫
复购
数据
分析
及
预测
...
一.背景商家有时会在特定日期,例如Boxing-day,黑色星期五或是双十一(11月11日)开展大型促销活动或者发放优惠...
赞
踩
article
BIM
+
GIS
技术突破!百公里
公路
设计
数据
+TB级
地形模型
不再是难题!_
公路
bim+
gis
...
公路
工程
GIS
+
BIM
解决方案
BIM
已成为各行业解决实际问题的重要生产工具,尤其是在高速
公路
等带状工程项目中,融合
BIM
...
赞
踩
article
区块
链
达摩院
落地 国研政情·经信
研究
:
夜总会
走出来阿里先锋...
区块
链
达摩院
落地国研政情·经信
研究
:
夜总会
走出来阿里先锋
区块
链
达摩院
落地 国研政情·经信
研究
:
夜总会
走出来阿里先锋 ...
赞
踩
article
关于如何
定制
开发
Android
第三方
ROM
,最全
开发
教程
、原理阐述...
一、首先,搞明白
ROM
的概念。广义上对于
ROM
,有两种定义:1.官方原厂
ROM
。就是官方适配的
ROM
,无修改,原汁原味由...
赞
踩
article
C++
函数
重载,引用,
auto
...
函数
重载:是
函数
的一种特殊情况,
C++
允许在同一作用域中声明几个功能类似的同名
函数
,这些同名
函数
的形参列表(参数个数 或...
赞
踩
article
ubuntu
刷新频率 如何
查看
_
ubuntu
查看
系统资源占用(
内存
,
cpu
和
进程
)...
1top
查看
ubuntu
的资源占用的命令为$: top说明:top命令就可以
查看
内存
,
cpu
和
进程
了,很方便top:主...
赞
踩
article
mipi
_
dsi
接口
转
lvds
显示(
GM8775C
)_
mipi
转
lvds
...
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1...
赞
踩
article
Java
API
文档
_
java
的
api
文档
是什么...
Java
API
文档
_
java
的
api
文档
是什么
java
的
api
文档
是什么 ...
赞
踩
article
HarmonyOS开发:解决
DevEco
Studio
低版本导入高版本项目运行失败问题_
the
"h...
基于
DevEco
Studio
4.0 Beta2,hvigorVersion为3.0.2,开发了一个项目,上传到了远程...
赞
踩
article
Python
遇见机器学习 ----
决策树
Decision
Tree_
python
decisio...
综述“独木难成林”本文采用编译器:jupyter
决策树
(
decision
tree
) 是一类常见的机器学习方法,顾名思...
赞
踩
article
STM32
通过
串口
发送
指令
控制
LED
灯亮灭O
LED
并显示命令...
接下来就不说废话了,自己看源代码吧!工程编译后下载到单片机就能实现
串口
控制
LED
灯的亮灭了。
STM32
通过
串口
发送
指令控...
赞
踩
article
【
无人机
】【
扩展
卡尔曼滤波
器
从
IMU
和
GPS
数据
计算
无人机
的姿态】使用不变
扩展
卡尔曼滤波
器
对微型无人...
摘要—随着微型空中飞行
器
(MAVs)变得更加价格实惠和普及,它们在复杂的城市环境中的用途将变得更加理想,例如检查、监测和...
赞
踩
article
【
OpenHarmony
鸿蒙
实战】在
RK3399
开发板
实现智能门禁
人脸识别
_
rk
开发板
鸿蒙
...
本样例是基于
RK3399
开发板
,使用
OpenHarmony
3.0-LTS开发的应用。通过定时获取摄像头数据,实现
人脸识别
...
赞
踩
article
多种
内
网
穿透
的实现方案_
内
网
穿透
方案
稳定性
...
需要注意的是,SSH隧道的性能受到SSH连接的影响,因此在使用SSH隧道时,需要考虑
网
络环境和SSH连接的
稳定性
,以确保...
赞
踩
article
JS
FA 调用 PA (展示
本地
相册
图片
)_
js
打开
本地
拍照和
相册
...
本项目以 ArkUI(
JS
)开发界面,利用
JS
FA 调用 JAVA PA 的接口功能,通过 JAVA 端拉取
本地
相册
...
赞
踩
article
组网
胖
模式
_
胖
AP
工作
模式
|
ZyXEL
...
方案描述
胖
AP
又称为自治型设备,
AP
设备作为单独的个体独立工作,通过无线方式与用户进行数据接收与发送。在设备运行前需对每...
赞
踩
article
查看
、
设置
CPU
工作频率
的
命令_去掉高通
cpu
最
高频点...
之前遇到过功耗问题,朝着
CPU
工作频率
方向思考,发现功耗过高
的
原因:为了性能让程序跑在大核上以下为
查看
、
设置
cpu
动态工...
赞
踩
相关标签
linux
运维
服务器
web安全
网络安全
网络
人工智能
android rom 工作
算法
3d
机器学习
数据分析
数据挖掘
oracle
sqlite
storm
elasticsearch
搜索引擎
c++
ubuntu 刷新频率 如何查看
shell
android
c语言
java