iOS 锁总结(cc)
iOS中atomic和synchrosize锁的本质是什么?
在iOS中,atomic和@synchronized锁的本质涉及底层的多线程同步机制。以下是关于这两者本质的详细解释:
atomic
-
定义与用途:
atomic是Objective-C属性修饰符的一种,用于指示属性的存取方法是线程安全的。- 当一个属性被声明为
atomic时,编译器会生成线程安全的存取方法,以确保在多线程环境下该属性的访问不会导致数据竞争。
-
实现机制:
- 在Objective-C的运行时实现中(例如在objc4的实现里),
atomic是通过自旋锁(spinlock_t)来实现的。 - 当一个线程尝试获取或设置
atomic属性时,它会先获取自旋锁,执行操作后释放锁。这确保了同一时间只有一个线程能够访问该属性。
- 在Objective-C的运行时实现中(例如在objc4的实现里),
-
性能与限制:
- 虽然
atomic能提供线程安全性,但它并不保证复合操作的原子性。例如,先检查后执行(check-then-act)的操作仍然可能不安全。 atomic属性的存取操作相对于nonatomic会有更高的性能开销,因为涉及到锁的获取和释放。
- 虽然
@synchronized
-
定义与用途:
@synchronized是Objective-C中的一个指令,用于创建一个互斥锁(mutex)来保护特定代码段的执行,防止多个线程同时执行该段代码。- 它用于确保一段代码在同一时间只能被一个线程执行,从而避免数据竞争和条件竞争。
-
实现机制:
@synchronized指令内部使用了一个互斥锁(mutex)来实现同步。- 当线程进入
@synchronized代码块时,会尝试获取锁。如果锁已经被其他线程持有,则当前线程会阻塞,直到锁被释放。 - 一旦线程获取了锁,它就可以安全地执行
@synchronized代码块中的代码。执行完毕后,锁会被自动释放。
-
性能与限制:
- 使用
@synchronized可以确保线程安全,但也会引入一定的性能开销,特别是在高并发场景下。 - 与
atomic不同,@synchronized可以用于保护更复杂的操作或代码段,而不仅仅是单个属性的存取。
- 使用
总的来说,atomic和@synchronized在iOS中都是用于实现线程同步的机制,但它们的用途和实现方式有所不同。atomic主要用于保护属性的线程安全存取,而@synchronized则用于保护更广泛的代码段免受并发访问的影响。
扩展:
iOS中atomic属性的作用是什么?
synchronized锁的使用场景有哪些?
atomic和synchronized有何不同?
自旋锁
iOS中自己怎么实现一个自旋锁?
在iOS中,你可以使用OSSpinLock来实现自旋锁,但需要注意的是,从iOS 10和macOS 10.12开始,Apple已经弃用了OSSpinLock,因为它可能在高并发情况下导致优先级反转和其他问题。尽管如此,为了解释概念,我会首先展示一个基于OSSpinLock的简单示例,然后提供一个使用pthread_spinlock_t的替代方案。
使用OSSpinLock(已弃用,不推荐使用)
Objective-C
复制代码
1
#import <libkern/OSSpinLock.h>
2
3
OSSpinLock lock = OS_SPINLOCK_INIT;
4
5
void criticalSection() {
6
OSSpinLockLock(&lock);
7
// 临界区代码
8
OSSpinLockUnlock(&lock);
9
}
使用pthread_spinlock_t(推荐方法)
Objective-C
复制代码
1
#include <pthread.h>
2
3
pthread_spinlock_t spinlock;
4
5
// 初始化自旋锁
6
pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE);
7
8
void criticalSection() {
9
pthread_spin_lock(&spinlock);
10
// 临界区代码
11
pthread_spin_unlock(&spinlock);
12
}
13
14
// 在不再需要锁时销毁它
15
pthread_spin_destroy(&spinlock);
在这个例子中,pthread_spinlock_t是POSIX线程库提供的自旋锁类型。使用pthread_spin_init函数初始化锁,并设置其为PTHREAD_PROCESS_PRIVATE,这意味着锁只能在同一进程的线程之间共享。在临界区前后分别调用pthread_spin_lock和pthread_spin_unlock函数来加锁和解锁。最后,当锁不再需要时,应调用pthread_spin_destroy来销毁锁。
使用std::atomic_flag实现自旋锁(C++11及更高版本)
如果你在使用C++,并且你的编译器支持C++11或更高版本,你还可以使用std::atomic_flag来实现一个简单的自旋锁:
C++
复制代码
1
#include <atomic>
2
#include <thread>
3
#include <chrono>
4
#include <iostream>
5
6
std::atomic_flag lock = ATOMIC_FLAG_INIT;
7
8
void criticalSection() {
9
while (lock.test_and_set(std::memory_order_acquire)) {
10
// 自旋等待锁被释放
11
std::this_thread::yield(); // 提示调度器当前线程愿意放弃当前CPU资源的占用
12
}
13
// 临界区代码
14
lock.clear(std::memory_order_release); // 释放锁
15
}
在这个C++示例中,std::atomic_flag是一个原子的布尔类型,可以用作自旋锁的基础。test_and_set方法尝试设置标志并返回其之前的值,如果返回true,则表示锁已经被占用,当前线程需要继续自旋等待。一旦获取到锁,线程就可以安全地进入临界区。完成临界区的操作后,使用clear方法来释放锁。
请注意,自旋锁适用于短时间的临界区保护,因为在等待锁的过程中,线程会持续消耗CPU资源。如果临界区的执行时间较长或者锁的竞争很激烈,使用其他类型的锁(如互斥锁ÿ
相关文章:
iOS 锁总结(cc)
iOS中atomic和synchrosize锁的本质是什么? 在iOS中,atomic和@synchronized锁的本质涉及底层的多线程同步机制。以下是关于这两者本质的详细解释: atomic 定义与用途: atomic是Objective-C属性修饰符的一种,用于指示属性的存取方法是线程安全的。当一个属性被声明为ato…...
【CSAPP】-binarybomb实验
目录 实验目的与要求 实验原理与内容 实验设备与软件环境 实验过程与结果(可贴图) 操作异常问题与解决方案 实验总结 实验目的与要求 1. 增强学生对于程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。 2. 掌握使用gdb调试器…...
SpringBoot实战:轻松实现XSS攻击防御(注解和过滤器)
文章目录 引言一、XSS攻击概述1.1 XSS攻击的定义1.2 XSS攻击的类型1.3 XSS攻击的攻击原理及示例 二、Spring Boot中的XSS防御手段2.1 使用注解进行XSS防御2.1.1 引入相关依赖2.1.2 使用XSS注解进行参数校验2.1.3 实现自定义注解处理器2.1.4 使用注解 2.2 使用过滤器进行XSS防御…...
如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?
(注:本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人,我一直有一个愿望:完成视频制作…...
TensorBoard进阶
文章目录 TensorBoard进阶1.设置TensorBoard2.图像数据在TensorBoard中可视化3.模型结构在TensorBoard中可视化(重点✅)4.高维数据在TensorBoard中低维可视化5.利用TensorBoard跟踪模型的训练过程(重点✅)6.利用TensorBoard给每个…...
使用AES加密数据传输的iOS客户端实现方案
在现代应用开发中,确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输,并与服务器端保持加密解密的一致性。本文不会包含服务器端代码,但会解释其实现原理。 加密与解密的基本原理 AES(Advance…...
vue3【实战】语义化首页布局
技术要点,详见注释 <script setup></script><template><div class"page"><header>页头</header><nav>导航</nav><!-- 主体内容 --><main class"row"><aside>左侧边栏<s…...
FANG:利用社交网络图进行虚假新闻检测
1.概述 社交媒体已逐渐演变成为公众获取信息的主要途径。然而,值得警惕的是,并非所有流通的信息都具备真实性。特别是在政治选举、疫情爆发等关键节点,带有恶意企图的虚假信息(即“假新闻”)可能会对社会秩序、公平性和理性思考造成严重的干扰。作为全球抗击COVID-19的一部…...
Vue2 基础八电商后台管理项目——中
代码下载 商品分类页 新商品分类组件 goods/Cate.vue,在router.js中导入子级路由组件 Cate.vue,并设置路由规则。 绘制商品分类基本结构 在Cate.vue组件中添加面包屑导航以及卡片视图中的添加分类按钮: <template><div><…...
Typescript window.localStorage 存储 Obj Value区别
window.localStorage.setItem(UserC, JSON.stringify(userC)) const userC JSON.parse(window.localStorage.getItem(UserC) || {}) 不能获得UserC,所有保存的时候需要存储value,而不是对象。 {"__v_isShallow":false, "__v_isRef&quo…...
Linux要解压 .rar 文件,你应该使用 unrar 命令
命令 sudo tar -zxf ~/WebDemo.rar -C /usr/local 有一些问题。tar 命令通常用于解压 .tar、.tar.gz 或 .tar.bz2 文件,而不是 .rar 文件。要解压 .rar 文件,你应该使用 unrar 命令。下面是正确的步骤: 首先,安装 unrar࿰…...
【qt】如何获取网卡的信息?
网卡不只一种,有有线的,有无线的等等 我们用QNetworkInterface类的静态函数allInterfaces() 来获取所有的网卡 返回的是一个网卡的容器. 然后我们对每个网卡来获取其设备名称和硬件地址 可以通过静态函数humanReadableName() 来获取设备名称 可以通过静态函数**hardwareAddre…...
使用Netty框架实现WebSocket服务端与客户端通信(附ssl)
仓库地址: https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书: #换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\mystore.jks -ext sanip:192.168.3.7,ip:127.0.0.1,dns:lo…...
ssm校园志愿服务信息系统-计算机毕业设计源码97697
摘 要 随着社会的进步和信息技术的发展,越来越多的学校开始重视志愿服务工作,通过组织各种志愿服务活动,让学生更好地了解社会、服务社会。然而,在实际操作中,志愿服务的组织和管理面临着诸多问题,如志愿者…...
JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程
1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有,那么必须执行类的加载过程(加载、检查…...
(七)glDrawArry绘制
几何数据:vao和vbo 材质程序:vs和fs(顶点着色器和片元着色器) 接下来只需要告诉GPU,使用几何数据和材质程序来进行绘制。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…...
记一次小程序渗透
这次的小程序渗透刚好每一个漏洞都相当经典所以记录一下。 目录 前言 漏洞详情 未授权访问漏洞/ 敏感信息泄露(高危) 水平越权(高危) 会话重用(高危) 硬编码加密密钥泄露(中危࿰…...
C++ 的常见算法 之一
C 的常见算法 之一 不修改序列算法for_eachcountfind 修改序列算法copymove 不修改序列算法 for_each #include <iostream> // std::cout #include <algorithm> // std::for_each #include <vector> // std::vectorusing namespace std;struc…...
微前端的需求有哪些?微前端的原理是怎么样的?为什么这么设计,及微前端的应用场景是什么?对有些客户,前端的重要性高于后端
微前端(Micro Frontends)是将前端应用拆分成多个独立、可部署的部分,每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务在后端的应用,是为了应对复杂前端应用的维护和扩展问题而提出的。 来龙去脉 背景…...
【Spring Boot】统一数据返回
目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维,简单…...
保姆级教程:用ESPHome给旧ESP8266设备(如NodeMCU V2)刷机,无缝接入Home Assistant
旧ESP8266设备焕新指南:从吃灰到智能家居中枢的完整实战 翻箱倒柜时发现几块落满灰尘的NodeMCU V2开发板?别急着扔掉——这些"过时"的硬件依然能在智能家居系统中大放异彩。本文将带你完成从硬件检测到高级功能集成的全流程改造,让…...
Harness Engineering: 为 AI 搭建可持续迭代环境的实践
在公司内部一个 AIGC页面 Verify 项目(下面代号 HelixVerify )中,我们经历了 114 次版本迭代, 将相对benchmark 的风险样本召回率从 最初的 8% 提升至 98.86%,无风险样本通过率从 36.11% 提升至 54.93%。 **整个 114 次迭代中,基本没有代码是我手写的。**从第一个版本开始,所有…...
Harmonyos应用实例226:复数的三角形式与运算
8. 复数的三角形式与运算 功能简介:将复数表示为三角形式,计算模和幅角,支持复数的乘法、除法运算的几何意义。通过复平面可视化展示复数的三角形式和运算过程,帮助学生理解复数的三角表示和运算规则。 ArkTS代码: @Entry @Component struct ComplexTrigonometric {@St…...
Tomcat 9.x 静态资源与SpringBoot应用跨域配置冲突?一个配置注释引发的‘血案’与解决方案
Tomcat 9.x静态资源与SpringBoot跨域配置的深度排错指南 当你在Tomcat中同时部署静态前端资源和SpringBoot应用时,是否遇到过这样的困境:明明按照官方文档配置了CORS过滤器,浏览器却依然抛出跨域错误?这个看似简单的配置背后&…...
收藏!小白程序员必备:从零入门大模型,抢占职场新风口(含学习资源包)
收藏!小白程序员必备:从零入门大模型,抢占职场新风口(含学习资源包) CB Insights报告显示,AI智能体市场正爆发式增长,2024年融资达38亿美元。市场分为基础设施、通用应用和垂直应用三大板块&…...
Aspose.Words避坑指南:Java实现Word转PDF时如何去除水印(2023最新版)
Aspose.Words商业应用实战:Java版Word转PDF无水印解决方案深度解析 在企业级文档处理系统中,Word到PDF的转换需求几乎无处不在——合同归档、报告生成、电子发票导出等场景都依赖这一基础功能。作为Java开发者,当我们选择Aspose.Words这一业界…...
别再只会发文本了!SpringBoot整合钉钉机器人,这5种高级消息模板让你的通知更专业
SpringBoot与钉钉机器人:五种高级消息模板实战指南 如果你还在用单调的文本消息推送系统通知,那么你的团队协作工具可能只发挥了50%的潜力。钉钉机器人提供的富文本消息类型,能够将枯燥的系统通知转化为直观、交互式的信息卡片,显…...
数据工程合规检查自动化:构建完整解决方案的10个关键步骤
数据工程合规检查自动化:构建完整解决方案的10个关键步骤 【免费下载链接】data-engineer-handbook Data Engineer Handbook 是一个收集数据工程师学习资料的项目。 - 提供数据工程师所需的知识、工具和资源,帮助数据工程师学习和成长。 - 特点ÿ…...
EVA-01保姆级教程:Qwen2.5-VL-7B多模态大模型在EVA-01中的本地化安全部署
EVA-01保姆级教程:Qwen2.5-VL-7B多模态大模型在EVA-01中的本地化安全部署 1. 引言:欢迎来到NERV指挥中心 想象一下,你面前有一个能看懂图片、理解图表、甚至能和你讨论图片里发生了什么的智能助手。现在,我们把这个助手装进了一…...
VisionPro实战:CogGraphicCollection在工业检测中的5个高效用法(附代码)
VisionPro实战:CogGraphicCollection在工业检测中的5个高效用法(附代码) 在工业自动化领域,机器视觉系统正变得越来越智能和高效。作为康耐视VisionPro平台的核心组件之一,CogGraphicCollection为工程师提供了强大的图…...
