当前位置: 首页 > news >正文

iOS 锁总结(cc)

iOS中atomic和synchrosize锁的本质是什么?  

在iOS中,atomic@synchronized锁的本质涉及底层的多线程同步机制。以下是关于这两者本质的详细解释:

atomic

  1. 定义与用途

    • atomic是Objective-C属性修饰符的一种,用于指示属性的存取方法是线程安全的。
    • 当一个属性被声明为atomic时,编译器会生成线程安全的存取方法,以确保在多线程环境下该属性的访问不会导致数据竞争。
  2. 实现机制

    • 在Objective-C的运行时实现中(例如在objc4的实现里),atomic是通过自旋锁(spinlock_t)来实现的。
    • 当一个线程尝试获取或设置atomic属性时,它会先获取自旋锁,执行操作后释放锁。这确保了同一时间只有一个线程能够访问该属性。
  3. 性能与限制

    • 虽然atomic能提供线程安全性,但它并不保证复合操作的原子性。例如,先检查后执行(check-then-act)的操作仍然可能不安全。
    • atomic属性的存取操作相对于nonatomic会有更高的性能开销,因为涉及到锁的获取和释放。

@synchronized

  1. 定义与用途

    • @synchronized是Objective-C中的一个指令,用于创建一个互斥锁(mutex)来保护特定代码段的执行,防止多个线程同时执行该段代码。
    • 它用于确保一段代码在同一时间只能被一个线程执行,从而避免数据竞争和条件竞争。
  2. 实现机制

    • @synchronized指令内部使用了一个互斥锁(mutex)来实现同步。
    • 当线程进入@synchronized代码块时,会尝试获取锁。如果锁已经被其他线程持有,则当前线程会阻塞,直到锁被释放。
    • 一旦线程获取了锁,它就可以安全地执行@synchronized代码块中的代码。执行完毕后,锁会被自动释放。
  3. 性能与限制

    • 使用@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_lockpthread_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实验

目录 实验目的与要求 实验原理与内容 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 操作异常问题与解决方案 实验总结 实验目的与要求 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 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…...

TensorBoard进阶

文章目录 TensorBoard进阶1.设置TensorBoard2.图像数据在TensorBoard中可视化3.模型结构在TensorBoard中可视化&#xff08;重点✅&#xff09;4.高维数据在TensorBoard中低维可视化5.利用TensorBoard跟踪模型的训练过程&#xff08;重点✅&#xff09;6.利用TensorBoard给每个…...

使用AES加密数据传输的iOS客户端实现方案

在现代应用开发中&#xff0c;确保数据传输的安全性是至关重要的。本文将介绍如何在iOS客户端中使用AES加密数据传输&#xff0c;并与服务器端保持加密解密的一致性。本文不会包含服务器端代码&#xff0c;但会解释其实现原理。 加密与解密的基本原理 AES&#xff08;Advance…...

vue3【实战】语义化首页布局

技术要点&#xff0c;详见注释 <script setup></script><template><div class"page"><header>页头</header><nav>导航</nav><!-- 主体内容 --><main class"row"><aside>左侧边栏<s…...

FANG:利用社交网络图进行虚假新闻检测

1.概述 社交媒体已逐渐演变成为公众获取信息的主要途径。然而,值得警惕的是,并非所有流通的信息都具备真实性。特别是在政治选举、疫情爆发等关键节点,带有恶意企图的虚假信息(即“假新闻”)可能会对社会秩序、公平性和理性思考造成严重的干扰。作为全球抗击COVID-19的一部…...

Vue2 基础八电商后台管理项目——中

代码下载 商品分类页 新商品分类组件 goods/Cate.vue&#xff0c;在router.js中导入子级路由组件 Cate.vue&#xff0c;并设置路由规则。 绘制商品分类基本结构 在Cate.vue组件中添加面包屑导航以及卡片视图中的添加分类按钮&#xff1a; <template><div><…...

Typescript window.localStorage 存储 Obj Value区别

window.localStorage.setItem(UserC, JSON.stringify(userC)) const userC JSON.parse(window.localStorage.getItem(UserC) || {}) 不能获得UserC&#xff0c;所有保存的时候需要存储value&#xff0c;而不是对象。 {"__v_isShallow":false, "__v_isRef&quo…...

Linux要解压 .rar 文件,你应该使用 unrar 命令

命令 sudo tar -zxf ~/WebDemo.rar -C /usr/local 有一些问题。tar 命令通常用于解压 .tar、.tar.gz 或 .tar.bz2 文件&#xff0c;而不是 .rar 文件。要解压 .rar 文件&#xff0c;你应该使用 unrar 命令。下面是正确的步骤&#xff1a; 首先&#xff0c;安装 unrar&#xff0…...

【qt】如何获取网卡的信息?

网卡不只一种,有有线的,有无线的等等 我们用QNetworkInterface类的静态函数allInterfaces() 来获取所有的网卡 返回的是一个网卡的容器. 然后我们对每个网卡来获取其设备名称和硬件地址 可以通过静态函数humanReadableName() 来获取设备名称 可以通过静态函数**hardwareAddre…...

使用Netty框架实现WebSocket服务端与客户端通信(附ssl)

仓库地址&#xff1a; https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书&#xff1a; #换成自己的本地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

摘 要 随着社会的进步和信息技术的发展&#xff0c;越来越多的学校开始重视志愿服务工作&#xff0c;通过组织各种志愿服务活动&#xff0c;让学生更好地了解社会、服务社会。然而&#xff0c;在实际操作中&#xff0c;志愿服务的组织和管理面临着诸多问题&#xff0c;如志愿者…...

JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程

1. 对象的创建 遇到new指令时 当Java虚拟机遇到一个字节码new指令时。 首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否被加载、解析和初始化过。 如果没有&#xff0c;那么必须执行类的加载过程(加载、检查…...

(七)glDrawArry绘制

几何数据&#xff1a;vao和vbo 材质程序&#xff1a;vs和fs(顶点着色器和片元着色器) 接下来只需要告诉GPU&#xff0c;使用几何数据和材质程序来进行绘制。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…...

记一次小程序渗透

这次的小程序渗透刚好每一个漏洞都相当经典所以记录一下。 目录 前言 漏洞详情 未授权访问漏洞/ 敏感信息泄露&#xff08;高危&#xff09; 水平越权&#xff08;高危&#xff09; 会话重用&#xff08;高危&#xff09; 硬编码加密密钥泄露&#xff08;中危&#xff0…...

C++ 的常见算法 之一

C 的常见算法 之一 不修改序列算法for_eachcountfind 修改序列算法copymove 不修改序列算法 for_each #include <iostream> // std::cout #include <algorithm> // std::for_each #include <vector> // std::vectorusing namespace std;struc…...

微前端的需求有哪些?微前端的原理是怎么样的?为什么这么设计,及微前端的应用场景是什么?对有些客户,前端的重要性高于后端

微前端&#xff08;Micro Frontends&#xff09;是将前端应用拆分成多个独立、可部署的部分&#xff0c;每个部分可以由不同的团队独立开发、测试、部署和维护。这种架构类似于微服务在后端的应用&#xff0c;是为了应对复杂前端应用的维护和扩展问题而提出的。 来龙去脉 背景…...

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维&#xff0c;简单…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...